MATLAB在数组列中找到第一个元素

时间:2016-07-21 19:48:42

标签: arrays matlab vectorization sparse-matrix

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

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]

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

如何以矢量化方式对任何常规矩阵(可能包含或不包含空列的矩阵)执行此操作?

2 个答案:

答案 0 :(得分:5)

代码:

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。然后唯一剩下的就是将ID号反转回来。

答案 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