how to use bsxfun or arrayfun to build the following matrix

3 visualizaciones (últimos 30 días)
Jason
Jason el 25 de Feb. de 2016
Editada: Walter Roberson el 25 de Feb. de 2016
Hi, there.
I want to use bsxfun or arrayfun to replace the following for loop.
for s=1:S
New_P(s,:)=P(s,:,U0(s));
end;
for example,
if P(,,1)=[1,2;3,4];
P(:,:,2)=[5,6;7,8];
U0=[1;2];
then the final result is New_P=[1,2;7,8];
Thank you in advance!
  2 comentarios
Adam
Adam el 25 de Feb. de 2016
Is there any particular reason why you want to use arrayfun or bsxfun? arrayfun is generally slower than a for loop and is also more suited to 1d arrays than multidimensional arrays. It can certainly be used for multidimensional arrays, but it effectively just interprets it as a 1d array anyway using linear indexing on the array.
I'm not aware of a syntax of bsxfun that would be useful for this, though maybe it is. I use it for certain specific tasks so haven't used all its capabilities.
Jason
Jason el 25 de Feb. de 2016
thank you for your comments. because when the size of the matrix is very large, the for loop is generally very unefficiency, so i want use a vectorized expression.

Iniciar sesión para comentar.

Respuesta aceptada

Guillaume
Guillaume el 25 de Feb. de 2016
Neither arrayfun nor bsxfun are useful for this. sub2ind is:
P = cat(3, [1 2;3 4], [5 6;7 8]);
U0 = [1;2];
New_P = P(sub2ind(size(P), ...
repmat((1:size(P, 1))', 1, size(P, 2)), ... rows where to pick the elements
repmat(1:size(P, 2), size(P, 1), 1), ... columns where to pick the elements
repmat(U0, 1, size(P, 2)))) %pages where to pick the elements
  1 comentario
Guillaume
Guillaume el 25 de Feb. de 2016
Note that you could generate the rows and columns matrix with ngrid if you prefer:
[rows, cols] = ndgrid(1:size(P, 1), 1:size(P, 2));
new_P = P(sub2ind(size(P), rows, cols, repmat(U0, 1, size(P, 2))))

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by