返回矩阵

时间:2016-09-07 20:22:20

标签: matlab vectorization

是否有一种向量化方式返回矩阵每行的最后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 A)

2 个答案:

答案 0 :(得分:2)

知道元素只有01,您可以在翻转的矩阵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));
相关问题