是否有一种向量化方式返回矩阵每行的最后K个非零元素的索引?
例如,我的矩阵只包含0和1,每行的最后一列总是1.然后我想找到最后一个K的索引,其中K> 1,每行的非零元素。如果一行只有M(小于K)个非零元素,则该行的索引只是最后一个M非零元素的索引。 e.g。
A = [0 1 0 1;
1 1 0 1;
1 1 1 1;
0 0 0 1]
我的K = 2,然后我希望返回一个矩阵
B = [0 1 0 1;
0 1 0 1;
0 0 1 1;
0 0 0 1]
即B
最初是一个与A
形状相同的零矩阵,然后它复制A
的每一行,其中相应的列从最后一个K非零的索引开始A
行的元素(如果在A
的一行中只有M
答案 0 :(得分:2)
知道元素只有0
或1
,您可以在翻转的矩阵cumsum
上使用A
制作掩码,并丢弃累积和大于k
:
A = [0 1 0 1;1 1 0 1;1 1 1 1;0 0 0 1]
k = 2;
C = fliplr(cumsum(fliplr(A), 2)); % take the cumulative sum backwards across rows
M = (C <= k); % cumsum <= k includes 0 elements too, so...
B = A .* M % multiply original matrix by mask
正如评论中所述(感谢@KQS!),如果您使用的是最新版本的MATLAB,那么direction
cumsum
可选参数会C
,所以生成C = cumsum(A, 2, 'reverse');
的行可以缩短为:
0 1 0 1
1 1 0 1
1 1 1 1
0 0 0 1
B =
0 1 0 1
0 1 0 1
0 0 1 1
0 0 0 1
结果: A =
Eng = {t[0]: [e] for t, e in Tuc.items()}
答案 1 :(得分:0)
知道find
函数可以得到最后k个元素的索引,我们可以使用bsxfun
将find应用于矩阵的行,以找出每行中哪个元素满足条件。 find
再次用于提取结果矩阵的非零元素的行和列,从而减少数据大小和操作的复杂性。然后将结果保存到稀疏矩阵,然后转换为完整矩阵:
A = [0 1 0 1;
1 1 0 1;
1 1 1 1;
0 0 0 1]
k = 2;
[row , col]= size(A);
last_nz = bsxfun(@(a,b)find(a,b,'last'),A',(repmat(k, 1, row))); %get indices of last two nonzero elements for each row
[~,rr,cc]=find(last_nz); %get columns and rows of correspondong element for whole matrix
B = full(sparse(rr,cc,1));