我有一个大小为M乘N的矩阵,其中每一行都有一些零条目。我想创建M行向量,使得每个向量包含每行的非零元素。例如,如果我有以下矩阵
A=[0 0 0 5;0 0 4 6;0 1 2 3;9 10 2 3]
我想要以下形式的四种不同的行向量
[5]
[4 6]
[1 2 3]
[9 10 2 3]
答案 0 :(得分:1)
由于Matlab不支持非矩形double
数组,因此您需要确定cell
数组。获得所需输出的一种快捷方法是将arrayfun
与logical indexing结合使用:
nonZeroVectors = arrayfun(@(k) A(k,A(k,:)~=0),1:size(A,1),'UniformOutput',false);
由于文档中指出的原因,我使用了{'UniformOutput'
,false
)名称 - 值对(我注意到对('uni'
,0
)也有效,但我更喜欢冗长)。此输入生成带有条目
>> nonZerosVectors{:}
ans =
5
ans =
4 6
ans =
1 2 3
ans =
9 10 2 3
答案 1 :(得分:1)
这可以使用accumarray
使用匿名函数作为第四个输入参数来完成。为确保结果与A
中的结果顺序相同,分组值用作第一个输入should be sorted。这需要使用A
转换为第二个输入(线性化版本)。
ind = repmat((1:size(A,2)).',1,size(A,2)).';
B = A.';
result = accumarray(ind(:), B(:), [], @(x){nonzeros(x).'});
使用A = [0 0 0 5; 0 0 4 6; 0 1 2 3; 9 10 2 3];
,这会给出
result{1} =
5
result{2} =
4 6
result{3} =
1 2 3
result{4} =
9 10 2 3