Matlab循环删除矩阵行时因尺寸动态变化导致循环异常的解决方法咨询
问题核心原因
正向遍历过程中删除矩阵行,会导致被删行之后的所有行索引整体前移1位,按原始矩阵尺寸计算的行索引会出现偏移,轻则漏判错判行,重则触发索引越界报错。
推荐解决方案(执行效率最高)
直接用MATLAB矢量化逻辑索引,先标记所有需要保留的行,一次性完成筛选,完全避免循环带来的索引问题,执行效率远高于循环遍历:
% 仅保留第二列不等于0的行,直接覆盖原矩阵即可 ContactPartData = ContactPartData(ContactPartData(:,2)~=0, :);
如果后续需要调整行筛选逻辑,只需要修改逻辑判断条件生成对应的掩码即可,不需要调整循环结构。
必须保留循环结构的解决方案
采用反向遍历的方式,从最后一行往第一行遍历,删除靠后的行不会影响尚未遍历的靠前行的索引:
% 先取原始总行数,从后往前遍历 total_row = size(ContactPartData,1); for row_idx = total_row : -1 : 1 if ContactPartData(row_idx,2) == 0 ContactPartData(row_idx,:) = []; end end
如果一定要保留原有的三层i/j/k循环结构,仅需要把三层循环的遍历顺序都改为从大到小,额外补充索引合法性判断即可:
for i = NT : -1 : 1 for j = NP : -1 : 1 for k = NP : -1 : 1 row_idx = (i-1)*(NP*(NP-1)) + ((j-1)*NP + k); % 补充索引合法性判断,避免边界越界 if row_idx <= size(ContactPartData,1) && ContactPartData(row_idx,2) == 0 ContactPartData(row_idx,:) = []; end end end end
内容的提问来源于stack exchange,提问作者Grady F. Mathews Iv
相关产品推荐
相关产品推荐

