在Matlab中以矢量形式创建Matrix的非零元素

时间:2016-04-15 23:18:47

标签: matlab

我有一个大小为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]

2 个答案:

答案 0 :(得分:1)

由于Matlab不支持非矩形double数组,因此您需要确定cell数组。获得所需输出的一种快捷方法是将arrayfunlogical 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