【问题标题】:Create Non Zero elements of Matrix in vector form in Matlab在 Matlab 中以向量形式创建矩阵的非零元素
【发布时间】:2016-08-08 02:03:14
【问题描述】:

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

【问题讨论】:

  • 您可以通过在 for 循环中遍历原始矩阵来构造所需的矩阵,检查元素是否为 0 并将因此选择的数字保存在向量中。

标签: matlab


【解决方案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

【讨论】:

【解决方案2】:

由于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多