【问题标题】:reducing number of 0 rows in matrix using matlab使用matlab减少矩阵中的0行数
【发布时间】:2019-11-07 03:33:04
【问题描述】:

我在 Matlab 中编写了以下程序

clc;
clear all;
close all;

matrix = [ 0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0;
           1 1 1 1 1 1 1 1;
           1 1 1 0 0 1 1 1;
           0 0 1 1 1 1 1 1;
           0 0 0 0 0 0 0 0;
           0 0 1 1 1 1 1 1;
           0 0 0 0 0 0 0 0;
           0 0 1 1 1 1 1 1;
           1 0 0 1 1 1 1 1;
           1 1 1 0 0 0 1 1];

[row,column] = size(matrix);

for i = 1:row
         if matrix(i,:) == 0
         matrix(i,:) = [];
         end
end
disp(matrix);

我期望的是输出矩阵中的 0 行将被删除。 我在哪里出错

Index in position 1 exceeds array bounds (must not exceed
8).

Error in Untitled (line 21)
         if matrix(i,:) == 0

>> 

【问题讨论】:

    标签: matlab


    【解决方案1】:

    当您从矩阵中删除一行时,它不再有row 行,而是row-1。由于您无法调整循环的限制,因此您将索引超出范围。此外,如果您删除行 i,您将跳过行 i+1

    相反,先找到所有需要删除的行,然后一次性全部删除:

    index = all(matrix == 0, 2);
    matrix(index,:) = [];
    

    你当然可以用一行代码写出来。

    【讨论】:

    • 感谢您的建议有效,我无法理解行 index = all(matrix == 0, 2); 的含义这是做什么的?
    • @sam: == 是逐元素比较。它返回一个true 的矩阵,其中matrix 为零。 all(...,2) 沿行查找,为所有元素为 true 的每一行返回 true
    【解决方案2】:

    作为@Cris said,您遇到越界错误的原因是您从头开始删除并在检查结尾之前缩小矩阵。

    解决此问题的另一种方法是简单地反转循环,从末端开始并朝着开头工作。这样,即使您删除了一行,也不会再次检查其索引。

    for i = row:-1:1   % loop from last row to first
             if matrix(i,:) == 0
             matrix(i,:) = [];
             end
    end
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多