Perform operation on matrix without for loop

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

[m,n] = size(offset);
x = bsxfun(@minus,x,reshape(offset,1,m,n));

Plus de réponses (1)

José-Luis
José-Luis le 19 Mar 2014
Modifié(e) : José-Luis le 19 Mar 2014
EDIT
permute(bsxfun(@minus,permute(x,[2 3 1]),offset),[3 1 2]);

2 commentaires

Shawn
Shawn le 19 Mar 2014
This returns a mismatched dimensions error.
José-Luis
José-Luis le 19 Mar 2014
Modifié(e) : José-Luis 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(:))

Connectez-vous pour commenter.

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!

Translated by