从零之间的现有矩阵创建新矩阵

时间:2013-07-31 00:42:32

标签: matlab matrix

我有一个包含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 个答案:

答案 0 :(得分:4)

步骤1:使用all创建包含 only zeros 的行的索引:

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:创建一个单元格数组,其中包含每个单元格中原始矩阵的连续段(使用cell arrays,每个单元格可以是不同的大小,甚至是不同的类型):

#% 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是流行的循环索引变量......您会注意到我使用了iiHere's why.

答案 1 :(得分: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
相关问题