Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 返回矩阵每行最后K个非零元素的索引_Matlab_Vectorization - Fatal编程技术网

Matlab 返回矩阵每行最后K个非零元素的索引

Matlab 返回矩阵每行最后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;

是否有一种向量化方法返回矩阵每行最后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
的每一行,其中相应的列从
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我在八度音阶上做这个,没有这个选项,但我会把它添加到答案中。谢谢!