2013-07-31 31 views
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

这里,保持所得到的单元阵列中的数据的列#另一种方法:

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 
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步:创建一个单元格数组,其中包含每个单元格中原始矩阵的连续段(使用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是流行的循环索引变量......你会发现我以前ii代替。 Here's why.