从矩阵中删除行
Removing rows from matrix
我有一个关于从矩阵中删除行的问题。我有下面的代码删除了我想要的行,但问题是每次删除一行都会改变矩阵的大小。当矩阵大小改变时,for循环不能再运行遍历矩阵原来的大小,因为它已经改变了。有谁知道如何解决这个问题?谢谢
for i = 1:NT
for j = 1:NP
for k = 1:NP
if ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),2) == 0
ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),:) = [];
else
end
end
end
end
对于这些情况,通常更容易记录要删除的行,然后在最后一次将它们全部删除。这比重复删除一行更有效。同时解决了您的问题!
toremove = false(size(ContactPartData,1),1);
for i = 1:NT
for j = 1:NP
for k = 1:NP
if ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),2) == 0
toremove((i-1)*(NP*(NP-1)) + ((j-1)*NP + k)) = true;
end
end
end
end
ContactPartData(toremove,:) = [];
当然,在这种特殊情况下,根本不需要循环:
toremove = ContactPartData(:,2) == 0;
ContactPartData(toremove,:) = [];
此外,可能以相反的方式执行此操作更有效,选择要保留的行(时间代码找出!):
tokeep = ContactPartData(:,2) ~= 0;
ContactPartData = ContactPartData(tokeep,:);
我有一个关于从矩阵中删除行的问题。我有下面的代码删除了我想要的行,但问题是每次删除一行都会改变矩阵的大小。当矩阵大小改变时,for循环不能再运行遍历矩阵原来的大小,因为它已经改变了。有谁知道如何解决这个问题?谢谢
for i = 1:NT
for j = 1:NP
for k = 1:NP
if ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),2) == 0
ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),:) = [];
else
end
end
end
end
对于这些情况,通常更容易记录要删除的行,然后在最后一次将它们全部删除。这比重复删除一行更有效。同时解决了您的问题!
toremove = false(size(ContactPartData,1),1);
for i = 1:NT
for j = 1:NP
for k = 1:NP
if ContactPartData((i-1)*(NP*(NP-1)) + ((j-1)*NP + k),2) == 0
toremove((i-1)*(NP*(NP-1)) + ((j-1)*NP + k)) = true;
end
end
end
end
ContactPartData(toremove,:) = [];
当然,在这种特殊情况下,根本不需要循环:
toremove = ContactPartData(:,2) == 0;
ContactPartData(toremove,:) = [];
此外,可能以相反的方式执行此操作更有效,选择要保留的行(时间代码找出!):
tokeep = ContactPartData(:,2) ~= 0;
ContactPartData = ContactPartData(tokeep,:);