How to Obtain the Indeces of the Minimum Value of Each Row in a Matrix and then Apply These Indeces to a New Matrix of the Same Size
4 次查看(过去 30 天)
显示 更早的评论
Say I have the following matrices:
x = [3 4; 1 3; 2 5; 7 4];
y = [1 2; 3 4; 5 6; 7 8];
If I want the minimum values by row in x, I can use
[M I] = min(x,[],2)
to obtain
M = [3; 1; 2; 4]
I = [1; 1; 1; 2]
but I am not sure how to apply I to the y matrix to obtain
y = [1; 3; 5; 8]
I have found that
diag(y(I,:))
works, but it is not efficient and will not work on the matrix that I need to apply this to, which is size(47*10^6,3). I also tried to use the find command, but I was unable to get that to work either.
0 个评论
采纳的回答
Sean de Wolski
2015-2-25
编辑:Sean de Wolski
2015-2-26
Use sub2ind to build a linear index and extract with this.
The rows will be (1:size(y,1)) and the columns will be your I
doc sub2ind
Something like this (not tested)
idx = sub2ind(size(y),(1:size(y,1))',I);
ymn = y(idx)
更多回答(1 个)
Matt J
2015-2-25
编辑:Matt J
2015-2-25
[m,n]=size(x);
mask=sparse(1:m, I,true,m,n);
ymin=sum(mask.*y,2)
3 个评论
Matt J
2015-2-25
This is pretty close to what I want, but it returns a sparse logical.
I think you mean a sparse double, not a sparse logical
>> whos ymin
Name Size Bytes Class Attributes
ymin 4x1 80 double sparse
Is it possible to make this return just the vector?
The result you see is a perfectly valid vector, but if you want to see it in the full form that you are used to,
>> ymin=full(ymin)
ymin =
1
3
5
8
What is meant by true?
true() is a built in MATLAB command that returns a scalar or matrix of true logical values, see
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!