2 views (last 30 days)

Matt J
on 6 Sep 2019

result=nan(2,2,100);

result(1,1,:)=a11.*b11 + a12.*b21;

result(1,2,:)=a11.*b12 + a12.*b22;

result(2,1,:)=a21.*b11 + a22.*b21;

result(2,2,:)=a21.*b12 + a22.*b22;

Fabio Freschi
on 6 Sep 2019

Let's start saying that the data structure you are using is not the best one. See https://www.mathworks.com/matlabcentral/answers/304528-tutorial-why-variables-should-not-be-named-dynamically-eval

If you really want to keep that structure, maybe the simplest answer is to make the manual multiplication

C = A*B <- matrix form

c11 = a11*b11+a12*b21 <- element form

since you have array, use .* operator

c11 = a11.*b11+a12.*b21

Note that this works only for 2x2 matrices.

For a more general approach, see

Fabio Freschi
on 6 Sep 2019

You can still make the slicing manually

% data

N = 10; A = rand(2,2,N); B = rand(2,2,N);

% preallocation

C = zeros(2,2,N);

% calculation

C(1,1,:) = A(1,1,:).*B(1,1,:) + A(1,2,:).*B(2,1,:);

C(1,2,:) = A(1,1,:).*B(1,2,:) + A(1,2,:).*B(2,2,:);

C(2,1,:) = A(2,1,:).*B(1,1,:) + A(2,2,:).*B(2,1,:);

C(2,2,:) = A(2,1,:).*B(1,2,:) + A(2,2,:).*B(2,2,:);

Fabio Freschi
on 6 Sep 2019

If you have data stored in cell arrays, you can use arrayfun

% data

N = 10;

A0 = arrayfun(@(i)rand(2,2),1:N,'UniformOutput',false);

B0 = arrayfun(@(i)rand(2,2),1:N,'UniformOutput',false);

% calculation

C = arrayfun(@(k)A0{k}*B0{k},1:N,'UniformOutput',false)

Sign in to comment.

Catalytic
on 6 Sep 2019

If you have the parallel computing toolbox, you can do this on the GPU with

pagefun(@mtimes,A,B)

but this may only provide gains if the pages A(:,:,i) and B(:,:,i) are large matrices.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.