首页 文章

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

提问于
浏览
2

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

  • 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
    
  • 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
    

相关问题