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 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Shawn
am 25 Feb. 2015
Bearbeitet: Sean de Wolski
am 26 Feb. 2015
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 Kommentare
Akzeptierte Antwort
Sean de Wolski
am 25 Feb. 2015
Bearbeitet: Sean de Wolski
am 26 Feb. 2015
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)
Weitere Antworten (1)
Matt J
am 25 Feb. 2015
Bearbeitet: Matt J
am 25 Feb. 2015
[m,n]=size(x);
mask=sparse(1:m, I,true,m,n);
ymin=sum(mask.*y,2)
3 Kommentare
Matt J
am 25 Feb. 2015
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
Siehe auch
Kategorien
Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!