我有一个包含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
显然我的数据文件有数千个数据点,我需要自动执行此操作。
任何想法怎么做?
答案 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公共服务公告:i
和j
是流行的循环索引变量......您会注意到我使用了ii
。 Here'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