【问题标题】:MATLAB find first elements in columns of arrayMATLAB 查找数组列中的第一个元素
【发布时间】:2016-07-21 19:48:41
【问题描述】:

在编写某个函数的上下文中,我有以下示例矩阵:

temp =

     1     2     0     0     1     0
     1     0     0     0     0     0
     0     1     0     0     0     1

我想获得一个数组,它的每个元素都表示开始该列的所有非零元素中的元素的数量。如果一列为空,则该元素应对应于下一个非空列。对于矩阵temp,结果为:

result = [1 3 5 5 5 6]

因为第一个非零元素开始第一列,第三个开始第二列,第五个开始第五列,第六个开始第六列。

如何以矢量化方式对任何通用矩阵(可能包含也可能不包含空列)执行此操作?

【问题讨论】:

  • 我不会将用零填充的列称为“空”列。一个空列将是例如[[1;3],[],[2;4]]的中间列
  • @Nibor MATLAB 不处理形状不规则的矩阵,例如中间有间隙。在 MATLAB 世界中,一列全为零是空的正确术语。
  • 我假设您按列主要顺序计算非零元素?
  • 假设您正在计算非零值按列主要顺序发生的位置的索引,您的预期结果是有意义的。为了理解问题,您的问题没有反映这个小但非常关键的细节。如有必要,请验证并更正您的问题。

标签: arrays matlab vectorization sparse-matrix


【解决方案1】:

代码:

temp = [1 2 0 0 1 0; 1 0 0 0 0 0; 0 1 0 0 0 1]
t10  = temp~=0
l2 = cumsum(t10(end:-1:1))
temp2 = reshape(l2(end)-l2(end:-1:1)+1, size(temp))
result = temp2(1,:)

输出:

temp =
     1     2     0     0     1     0
     1     0     0     0     0     0
     0     1     0     0     0     1

t10 =
     1     1     0     0     1     0
     1     0     0     0     0     0
     0     1     0     0     0     1

l2 =
     1     1     1     1     1     2     2     2     2     2     2     2     3     3     4     4     5     6

temp2 =
     1     3     5     5     5     6
     2     4     5     5     6     6
     3     4     5     5     6     6

result =
     1     3     5     5     5     6

每个步骤的打印值可能比我的解释更清楚。基本上我们使用cumsum 来获取非零元素的ID。由于您需要在到达元素之前知道 ID,因此可以使用反向的 cumsum。那么剩下的就是把身份证号码倒过来。

【讨论】:

  • 您可能需要调整倒数第二个语句以考虑任意大小的矩阵,而不仅仅是 3 x 6
  • 非常聪明!可以做一些解释,而不是直接的代码转储:)
  • 没问题。顺便说一句,使用cumsum 非常聪明。 +1。
  • 我用不同的方式尝试了一段时间,但无法弄清楚。 +1 :)
【解决方案2】:

这是另一种方式:

temp = [1 2 0 0 1 0; 1 0 0 0 0 0; 0 1 0 0 0 1]; % data
[~, c] = find(temp); % col indices of nonzero elements
result = accumarray(c, 1:numel(c), [], @min, NaN).'; % index, among all nonzero
    % values, of the first nonzero value of each col; or NaN if none exists
result = cummin(result, 'reverse'); % fill NaN's using backwards cumulative maximum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2015-05-23
    相关资源
    最近更新 更多