Matlab 返回矩阵每行最后K个非零元素的索引
是否有一种向量化方法返回矩阵每行最后K个非零元素的索引 例如,我的矩阵只包含0和1,并且每行的最后一列始终为1。然后我想找到最后K的索引,其中K>1,每行的非零元素。如果一行只有M个(小于K个)非零元素,那么该行的索引就是最后M个非零元素的索引。e、 gMatlab 返回矩阵每行最后K个非零元素的索引,matlab,vectorization,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;
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
的每一行,其中相应的列从a
行的最后K个非零元素的索引开始(如果在A
的一行中只有MA
行的最后M个非零元素的索引开始)知道元素只有0
或1
,您可以使用翻转矩阵a
上的cumsum
制作一个掩码,并丢弃累积和大于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
结果:
A=
知道元素仅为
0
或1
,您可以使用翻转矩阵a
上的cumsum
制作掩码,并丢弃累积和大于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
结果:
A=
知道
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));
知道
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));
可以肯定的是,对于
A
中的任何一行r
,您都希望得到find(A(r,1:end-1)>0,1,'last')
,但是没有循环r
?几乎正确,我希望找到最后的K个非零元素,其中K是给定的参数,因此您要查找A(r,find(A(r,1:end-1)~=0,K,'last'))
,矩阵B
上的整个部分确实不清楚……我同意你的观点。但最终,我想生成一个矩阵B,这样我就可以使用矩阵B的每一行作为一些索引集。为了确保,对于a
中的任何一行r
,你都想得到find(a(r,1:end-1)>0,1,'last')
,但是没有循环r
?几乎正确,我想找到最后的K个非零元素,其中K是给定的参数,因此您要查找a(r,find(a(r,1:end-1)~=0,K,'last'))
,B
矩阵的整个部分确实不清楚……我同意你的观点。但最终,我想生成一个矩阵B,这样我就可以使用矩阵B的每一行作为一些索引集。在较新版本的MATLAB中,cumsum
采用一个可选的“方向”参数,因此你可以这样做:C=cumsum(a,2,'reverse')
@KQS哦,这让它更漂亮了。:D我在八度音阶上做这个,没有这个选项,但我会把它添加到答案中。谢谢!在较新版本的MATLAB中,cumsum
接受一个可选的“方向”参数,所以你可以这样做:C=cumsum(A,2,'reverse'))
@KQS哦,这让它更漂亮了。:D我在八度音阶上做这个,没有这个选项,但我会把它添加到答案中。谢谢!