Simpler way without for loops
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
Meghana Dinesh
il 2 Dic 2014
Risposto: Andrei Bobrov
il 2 Dic 2014
How can I implement this without using for loops?
for i = 1:i_rows
Mat_NX3(i,1) = (Mat_A_3D (idx(i,1), idx(i,2), 1) );
Mat_NX3(i,2) = (Mat_A_3D (idx(i,1), idx(i,2), 2) );
Mat_NX3(i,3) = (Mat_A_3D (idx(i,1), idx(i,2), 3) );
end
where:
- Mat_NX3 is the output N X 3 matrix
- Mat_A_3D is a 3D matrix
- idx is a matrix with 2 columns, (index points) telling which co-ordinate values should be copied from Mat_A_3D into Mat_NX3. It has i_rows number of rows
Example if
Mat_A_3D (:,:,1) = [1 2 3
4 5 6
7 8 9];
Mat_A_3D (:,:,2) = [1 2 3
4 5 6
7 8 9];
Mat_A_3D (:,:,3) = [1 2 3
4 5 6
7 8 9];
and
idx = [1,1
3,3];
output
Mat_NX3 = [1 1 1;
9 9 9];
0 Commenti
Risposta accettata
Sean de Wolski
il 2 Dic 2014
Modificato: Andrei Bobrov
il 2 Dic 2014
I would just keep the for-loops.
Alternatively, you could use sub2ind to build a linear index from the pieces and then index with it:
% Size
sz = size(Mat_A_3D);
% First page only
idx = sub2ind(sz,idx(:,1),idx(:,2));
% Add second and third pages:
idx3 = bsxfun(@plus,idx,(0:sz(3)-1)*sz(1)*sz(2));
MatNX3 = Mat_A_3D(idx3)
3 Commenti
Più risposte (2)
Thorsten
il 2 Dic 2014
sz = size(Mat_A_3D);
ind = sub2ind(sz(1:2), idx(:,1), idx(:, 2));
offset = repmat(cumsum(repmat(prod(sz(1:2)), [1 sz(3)-1])), [size(ind) 1]);
ind = [ind repmat(ind, [1 size(offset, 2) 1]) + offset];
Mat_NX3 = Mat_A_3D(ind)
0 Commenti
Andrei Bobrov
il 2 Dic 2014
n = size(M);
x = zeros(n);
x(sub2ind(n,idx(:,1),idx(:,2))) = 1;
out = reshape(M(cumsum(x,3) > 0),size(idx,1),[]);
0 Commenti
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!