How can I apply arrayfun with 2D matrix inputs?

3 Ansichten (letzte 30 Tage)
Daichi
Daichi am 26 Jun. 2017
Kommentiert: Andrei Bobrov am 26 Jun. 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 Kommentare
Andrei Bobrov
Andrei Bobrov am 26 Jun. 2017
Bearbeitet: Andrei Bobrov am 26 Jun. 2017
It is unlikely that the arrayfun will accelerate.
Daichi
Daichi am 26 Jun. 2017
Thank you. I see. Is there any way to handle this kind of processing?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 26 Jun. 2017
Bearbeitet: Andrei Bobrov am 26 Jun. 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 Kommentare
Daichi
Daichi am 26 Jun. 2017
Bearbeitet: Daichi am 26 Jun. 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 am 26 Jun. 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]);

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu 行列および配列 finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!