MATLAB Answers

## Need to improve efficiency in this code, which multiplies a 3D matrix by a 2D one

Asked by Tom

### Tom (view profile)

on 13 Jul 2015
Latest activity Commented on by Tom

### Tom (view profile)

on 16 Jul 2015
Accepted Answer by Andrei Bobrov

### Andrei Bobrov (view profile)

Hi, I have this code, which uses for loops and multiplies a 3D matrix with a 2D one. It works, but I need f_N to be 3200, and once f_N is that high, it is just too big a calculation for my computer to do. The weird thing is, I have run this code successfully about 10 months ago - I know this because I have a plot generated from it. But I must have changed something maybe.
Anyway, here's the code:
clear all;
num_x = 275;
num_y = 275;
f_N = 100;
W_rsTpre = rand(25,num_x,num_y);
W_rsT(1,:,:,:) = W_rsTpre;
q_pre = rand(25,f_N);
q(:,1,:) = q_pre;
w_pre = zeros(num_x,num_y,1,f_N); % preallocate
for xx = 1:num_x
for yy = 1:num_y
for ff = 1:f_N
w_pre(xx,yy,1,ff) = W_rsT(1,:,xx,yy)*q(:,1,ff);
end
end
end
w = squeeze(w_pre);
Thanks

#### 0 Comments

Sign in to comment.

## 1 Answer

Answer by Andrei Bobrov

### Andrei Bobrov (view profile)

on 13 Jul 2015
Edited by Andrei Bobrov

### Andrei Bobrov (view profile)

on 13 Jul 2015
Accepted Answer

W = reshape(W_rsT,size(W_rsT,2),[]).';
q1 = squeeze(q);
w_pre = reshape(W*q1,[num_x, num_y,1,f_N]);

Tom

### Tom (view profile)

on 16 Jul 2015
Thank you. Strangely, when I used iequal to see if the two results matched, they did not. But when I plotted them both, they seemed to sit on top of one another - so they must have been pretty much the same.
Many thanks

Sign in to comment.