3

我有一个包含 0 和“正确”数据的矩阵数据。我想创建几个矩阵(新矩阵)以将数据与零分开并摆脱这些零。

所以,这是一个简单的例子:

data = 1   3   6   4
       3   6   9   5
       4   5   6   2
       0   0   0   0
       0   0   0   0
       2   4   1   8
       1   4   6   5
       0   0   0   0
       1   7   9   1
       3   4   5   8

在这种情况下,我想得到两个矩阵:

A =1   3   6   4
   3   6   9   5
   4   5   6   2



B= 2   4   1   8
   1   4   6   5



C = 1   7   9   1
    3   4   5   8

显然我的数据文件有数千个数据点,我需要自动执行此操作。

任何想法如何做到这一点?

4

2 回答 2

4

第 1 步:使用all创建仅包含零的行的索引:

index = all(data==0,2); #% data==0<-- logical matrix; the 2 means along dimension 2

第 2 步:创建包含所需值的每个段的第一个和最后一个索引的向量:

index = [1; double(index); 1]; #% convert to numeric and pad with ones
firsts = diff(index)==-1; #% 0 (real row) - 1 (spacer row) = -1
lasts = (diff(index)==1)-1; #% subtract 1 because of padding

第 3 步:创建一个元胞数组,其中包含每个元胞中原始矩阵的连续段(使用元胞数组,每个元胞可以是不同的大小,甚至是不同的类型):

#% firsts and lasts should be the same length
#% iterate through lists of first/last indices
for ii=1:length(firsts)
    result{ii} = data(firsts(ii):lasts(ii), :);
end

强制性 Matlab 公共服务公告:i并且j是流行的循环索引变量......你会注意到我使用ii了。 这就是为什么。

于 2013-07-31T01:18:50.750 回答
2

这是另一种方法,可以将 # 列数据保留在结果单元格数组中:

   L=bwlabel(data);
   for n=1:max(L)
       result{n}=reshape(data(L==n),[],size(data,2));
   end


result = 
[3x4 double]    [2x4 double]    [2x4 double]

result{1}
ans =
         1     3     6     4
         3     6     9     5
         4     5     6     2
于 2013-07-31T03:17:35.897 回答