how to use index referencing ?

1 Ansicht (letzte 30 Tage)
Islam
Islam am 27 Feb. 2014
Beantwortet: Sean de Wolski am 27 Feb. 2014
I have A =
[1 -2 1 0.7 3
1 -0.1 -3 2 -0.2
0 0 1 1 -2 ]
I want to choose the most negative of each column, and drop the rest. If a column doesn't have negative values then it is zero. Thus, the above matrix will be
A =
[ 0 -2 0 0 0
0 0 -3 0 0
0 0 0 0 -2 ]
Also, I want to keep the values of the same index in the x matrix.
x =
[ 440 680 520 240 730
440 680 520 240 730
440 680 520 240 730 ]
. Thus, x will be
x =
[ 0 680 0 0 0
0 0 520 0 0
0 0 0 0 730 ]
Thanks for your quick responses,

Antworten (2)

Jos (10584)
Jos (10584) am 27 Feb. 2014
Assuming A and X are your input arrays
szA = size(A)
B = zeros(szA)
[minA,Rix] = min(A,[],1) % minimum value per column, and the row index
LinIDX = sub2ind(size(A), Rix, 1:szA(2))
B(LinIDX) = minA
B = min(B,0) % for cases when all elements in a column of A are positive
X2 = (B<0) .* X
  2 Kommentare
Islam
Islam am 27 Feb. 2014
but this answer doesn't drop negative values if they are not the minimum in the column.
Each column should he one value only. but in your solution I have more than one value ..
Jos (10584)
Jos (10584) am 27 Feb. 2014
The result is stored in variable B not in A. Each column of B holds a single value, namely the minimum value in that column of A, as you requested. If you want to have it stored in A, you can always execute:
A = B

Melden Sie sich an, um zu kommentieren.


Sean de Wolski
Sean de Wolski am 27 Feb. 2014
A = [1 -2 1 0.7 3
1 -0.1 -3 2 -0.2
0 0 1 1 -2 ];
x = rand(size(A));
B = bsxfun(@times,bsxfun(@eq,A,min(A,[],1)),min(A,0));
x(B==0) = 0;

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by