`Z(i)=A(i, Y(i))`

without using loops? In other words I need to pick one (and only one) element per row while the indexes of elements vary in rows. This is easy if using loops but I am a ``vectorization freak.''

Below is a solution I found out. A is the given matrix. Y is the array specifying the element of each row to be picked out.

Please note I call trace() function in the end, because I don't really need the array Z but only its sum. So I simply need to sum the diagonal of the last square matrix.

Comments are welcomed. Do you know any name for this operation? And does Octave or MATLAB already has a solution for this?

octave:2> A=magic(10)(:,1:4) A = 92 99 1 8 98 80 7 14 4 81 88 20 85 87 19 21 86 93 25 2 17 24 76 83 23 5 82 89 79 6 13 95 10 12 94 96 11 18 100 77 octave:3> Y=ceil(rand(10,1)*4) Y = 2 1 1 3 2 1 3 4 2 3 octave:4> A(:,Y) ans = 99 92 92 1 99 92 1 8 99 1 80 98 98 7 80 98 7 14 80 7 81 4 4 88 81 4 88 20 81 88 87 85 85 19 87 85 19 21 87 19 93 86 86 25 93 86 25 2 93 25 24 17 17 76 24 17 76 83 24 76 5 23 23 82 5 23 82 89 5 82 6 79 79 13 6 79 13 95 6 13 12 10 10 94 12 10 94 96 12 94 18 11 11 100 18 11 100 77 18 100 octave:5> Z=diag(A(:,Y)) Z = 99 98 4 19 93 17 82 95 12 100 octave:6> trace(A(:,Y)) ans = 619 octave:7> sum(diag(A(:,Y))) ans = 619

## No comments:

Post a Comment