How can I apply arrayfun with 2D matrix inputs?

11 visualizaciones (últimos 30 días)
Daichi
Daichi el 26 de Jun. de 2017
Comentada: Andrei Bobrov el 26 de Jun. de 2017
I want to accelerate the following code.
B=zeros(N,M,M);
for n=1:N
B(n,:,:)=inv(A(n,:,:));
end
where the size of A is N x M x M. Arrayfun doesn't support such a matrix input. So I would like to know the way to accelerate it.
Thank you in advance!
  2 comentarios
Andrei Bobrov
Andrei Bobrov el 26 de Jun. de 2017
Editada: Andrei Bobrov el 26 de Jun. de 2017
It is unlikely that the arrayfun will accelerate.
Daichi
Daichi el 26 de Jun. de 2017
Thank you. I see. Is there any way to handle this kind of processing?

Iniciar sesión para comentar.

Respuesta aceptada

Andrei Bobrov
Andrei Bobrov el 26 de Jun. de 2017
Editada: Andrei Bobrov el 26 de Jun. de 2017
B = permute(A,[2,3,1]);
eye3 = eye(3);
for jj = 1:size(B,3)
B(:,:,jj) = B(:,:,jj)\eye3;
end
B = permute(B,[3,1,2]);
or within cellfun:
B = permute(cell2mat(cellfun(@(x)x\eye(3),...
num2cell(permute(A,[2,3,1]),[1,2]),'un',0)),[3,1,2]);
  2 comentarios
Daichi
Daichi el 26 de Jun. de 2017
Editada: Daichi el 26 de Jun. de 2017
I see that cellfun is available in this case. But I eventually found that this kind of processing cannot be accelerated even if we use cellfun as you described. I guess num2cell and cell2mat may require some computational costs. Fortunately, the first one using backslash operator was faster. Anyway, thank you so much for your kind answer.
Andrei Bobrov
Andrei Bobrov el 26 de Jun. de 2017
Within arrayfun:
B = permute(A,[2,3,1]);
Bc = arrayfun(@(ii)B(:,:,ii)\eye(3),reshape(1:size(B,3),1,1,[]),'un',0);
B = permute(cell2mat(Bc),[3,1,2]);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre 行列および配列 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!