spa*_*ger 1 arrays matlab vectorization sparse-matrix
在编写某个函数的上下文中,我有以下示例矩阵:
temp =
1 2 0 0 1 0
1 0 0 0 0 0
0 1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
我想获得一个数组,其中每个元素指示从该列开始的所有非零元素中的元素数.如果列为空,则该元素应对应于下一个非空列.对于矩阵temp,结果将是:
result = [1 3 5 5 5 6]
Run Code Online (Sandbox Code Playgroud)
因为第一个非零元素开始第一列,第三列开始第二列,第五列开始第五列,第六列开始第六列.
如何以矢量化方式对任何通用矩阵(可能包含或不包含空列的矩阵)执行此操作?
码:
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,:)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
每个步骤的打印值可能比我的解释更清楚.基本上我们cumsum用来获取非零元素的ID.因为你需要在到达元素之前知道ID,反之亦然cumsum.然后唯一剩下的就是将ID号反转回来.