从现有矩阵中寻找两个零之间的数,创建一个新的矩阵。

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

显然,我的数据文件有数千个数据点,我需要自动化处理它。你有什么想法吗?
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

第三步:创建一个单元数组,其中每个单元格都包含原始矩阵中的连续段(使用单元数组,每个单元格可以是不同的大小,甚至是不同的类型):
#% 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公告: ij 是常用的循环索引变量... 你会注意到我使用了 ii这是为什么。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接