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.

 채택된 답변

Roger Stafford
Roger Stafford 2014년 3월 19일

0 개 추천

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

추가 답변 (1개)

José-Luis
José-Luis 2014년 3월 19일
편집: José-Luis 2014년 3월 19일

0 개 추천

EDIT
permute(bsxfun(@minus,permute(x,[2 3 1]),offset),[3 1 2]);

댓글 수: 2

Shawn
Shawn 2014년 3월 19일
This returns a mismatched dimensions error.
José-Luis
José-Luis 2014년 3월 19일
편집: José-Luis 2014년 3월 19일
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(:))

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 MATLAB에 대해 자세히 알아보기

질문:

2014년 3월 19일

편집:

2014년 3월 19일

Community Treasure Hunt

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

Start Hunting!

Translated by