How can I apply arrayfun with 2D matrix inputs?

12 次查看(过去 30 天)
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 个评论
Andrei Bobrov
Andrei Bobrov 2017-6-26
编辑:Andrei Bobrov 2017-6-26
It is unlikely that the arrayfun will accelerate.
Daichi
Daichi 2017-6-26
Thank you. I see. Is there any way to handle this kind of processing?

请先登录,再进行评论。

采纳的回答

Andrei Bobrov
Andrei Bobrov 2017-6-26
编辑:Andrei Bobrov 2017-6-26
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 个评论
Daichi
Daichi 2017-6-26
编辑:Daichi 2017-6-26
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 2017-6-26
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]);

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 行列および配列 的更多信息

Community Treasure Hunt

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

Start Hunting!