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