# perform matrix operation without for loop

2 views (last 30 days)
SChow on 25 Sep 2020
Commented: Ameer Hamza on 25 Sep 2020
I have a matrix (exp_data) of size 25000*45000. I need to perform the following operations as in the code, however with the for loop it takes ~4 hours to operate,
beta is a set of 3 values, for which I need to perform the operations. beta=[0.1, 0.04, 0.6]
any help is much appreciated
for m=1:3
for i=1:25000
for j=1:45000
if exp_data(i,j)>1.5;
xes(i,j)=exp(beta(m).*(exp_data(i,j)));
else xes(i,j)=1;
end;
end
end;
xe(:,:,m)=xes;
end;

madhan ravi on 25 Sep 2020
Edited: madhan ravi on 25 Sep 2020
xe = exp(reshape(beta, 1, 1, []) .* exp_data) .* (exp_data > 1.5) + 1 * (exp_data <= 1.5);
% use bsxfun() for implicit expansion in older versions
xe = exp(bsxfun(@times, reshape(beta, 1, 1, []), exp_data)) .* (exp_data > 1.5) + 1 * (exp_data <= 1.5);
Ameer Hamza on 25 Sep 2020
Not sure if MATLAB realizes that when (exp_data > 1.5) is 0, it should avoid the corresponding calculations in exp(reshape(beta, 1, 1, []); otherwise, that is just a waste of computation. 🤔

Ameer Hamza on 25 Sep 2020
Edited: Ameer Hamza on 25 Sep 2020
Following code is equivalent
xe = zeros([size(exp_data) numel(beta)]);
for m = 1:numel(beta)
xes = ones(size(exp_data));
xe(:,:,m) = xes;
end
Not sure if there are any speed improvements since JIT compiler is already claimed to be working very well.
##### 2 CommentsShowHide 1 older comment
Ameer Hamza on 25 Sep 2020
Yes!! Thanks for correction.

### Categories

Find more on MATLAB Compiler in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by