我有一个大小为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]
这可以使用accumarray使用匿名函数作为第四个输入参数来完成 . 为确保结果与 A 中的顺序相同,分组值用作第一个输入should be sorted . 这需要使用(线性化版本) A 转置为第二输入 .
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]; ,这给了
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
由于Matlab不支持非矩形 double 数组,因此您需要确定 cell 数组 . 获得所需输出的一种快速方法是将arrayfun与logical indexing组合:
double
cell
nonZeroVectors = arrayfun(@(k) A(k,A(k,:)~=0),1:size(A,1),'UniformOutput',false);
我使用('UniformOutput',false)名称 - 值对出于文档中指出的原因(我会注意到这对( 'uni' , 0 )也有效,但我更喜欢冗长) . 此输入生成带有条目的单元阵列
'uni'
0
>> nonZerosVectors{:} ans = 5 ans = 4 6 ans = 1 2 3 ans = 9 10 2 3
2 回答
这可以使用accumarray使用匿名函数作为第四个输入参数来完成 . 为确保结果与
A
中的顺序相同,分组值用作第一个输入should be sorted . 这需要使用(线性化版本)A
转置为第二输入 .随着
A = [0 0 0 5; 0 0 4 6; 0 1 2 3; 9 10 2 3];
,这给了由于Matlab不支持非矩形
double
数组,因此您需要确定cell
数组 . 获得所需输出的一种快速方法是将arrayfun与logical indexing组合:我使用('UniformOutput',false)名称 - 值对出于文档中指出的原因(我会注意到这对(
'uni'
,0
)也有效,但我更喜欢冗长) . 此输入生成带有条目的单元阵列