【问题标题】:Removing rows from matrix从矩阵中删除行
【发布时间】:2021-11-14 05:55:50
【问题描述】:

我有一个关于从矩阵中删除行的问题。我有下面的代码,它删除了我想要的行,但问题是每次删除一行时它都会改变矩阵的大小。当矩阵的大小发生变化时,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

【问题讨论】:

  • 您可能不得不使用while 语句而不是for 循环。

标签: arrays matlab loops


【解决方案1】:

对于这些情况,通常更容易记录要删除的行,然后在最后一次将它们全部删除。这比重复删除单行更有效。同时也解决了你的问题!

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,:);

【讨论】:

  • 哇,非常感谢。这非常有效。显然,我有很多关于 MATLAB 编码的知识。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2011-12-26
  • 2016-05-26
相关资源
最近更新 更多