Perform operation on matrix without for loop
Afficher commentaires plus anciens
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.
Réponse acceptée
Plus de réponses (1)
EDIT
permute(bsxfun(@minus,permute(x,[2 3 1]),offset),[3 1 2]);
2 commentaires
Shawn
le 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(:))
Catégories
En savoir plus sur MATLAB dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!