Perform operation on matrix without for loop
1 view (last 30 days)
Show older comments
So I have a 122x64x64 matrix x that has a grid of signals over time. First dim is time, second is x and third is y. Since the signals are all small signals with large DC offsets, I want to remove the offsets from the signals for all time values. The offsets for each signal are stored in a 64x64 matrix.
Here is the code I am currently using:
for a=1:64
for b=1:64
x(:,a,b) = x(:,a,b) - offset(a,b);
end
end
Is there a faster way to do this without a for loop? Later I want to do other similar operations, so a non-loop method would be preferred.
0 Comments
Accepted Answer
Roger Stafford
on 19 Mar 2014
[m,n] = size(offset);
x = bsxfun(@minus,x,reshape(offset,1,m,n));
0 Comments
More Answers (1)
José-Luis
on 19 Mar 2014
Edited: José-Luis
on 19 Mar 2014
EDIT
permute(bsxfun(@minus,permute(x,[2 3 1]),offset),[3 1 2]);
2 Comments
José-Luis
on 19 Mar 2014
Edited: José-Luis
on 19 Mar 2014
My bad, forgot about non-singleton dimensions...
x = rand(128,64,64);
offset = rand(64);
tic
your_mat = permute(bsxfun(@minus,permute(x,[2 3 1]),offset),[3 1 2]);
toc
your_mat_1 = x;
for a=1:64
for b=1:64
your_mat_1(:,a,b) = x(:,a,b) - offset(a,b);
end
end
toc
all(your_mat(:) == your_mat_1(:))
See Also
Categories
Find more on Loops and Conditional Statements 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!