In matlab it is easy to subtract number from column or row. I want to subtract column [n x 1] from a matrix [n x m]. Is it possible to doit without for loop? When I wrote it just with '-', there was dimension mismatch error. Thanks.

 채택된 답변

Image Analyst
Image Analyst 2014년 9월 25일

1 개 추천

You could use repmat() to create an array of the same size:
out = inputArray - repmat(columnVector, [1, m]);

댓글 수: 6

Mikhail
Mikhail 2014년 9월 25일
Yea, seems like this is the fastest way. I think this must work faster, then for loop. Thanks.
Guillaume
Guillaume 2014년 9월 25일
편집: Guillaume 2014년 9월 25일
No, bsxfun is faster and this is the exact purpose of it.
Not always.
inputArray = rand(100,100);
columnVector = rand(100, 1);
tic
out = bsxfun(@minus, inputArray, columnVector);
toc
tic;
out = inputArray - repmat(columnVector, [1, 100]);
toc
Elapsed time is 0.000508 seconds.
Elapsed time is 0.000357 seconds.
José-Luis
José-Luis 2014년 9월 25일
편집: José-Luis 2014년 9월 25일
To continue with the one-upping: When it is that fast, unless you are doing it many many times, it doesn't really matter.
Just did a quick test:
ii = [10 100 200 300 400 500 1000 2000 5000 7500 10000 20000]
a = [ii' ii'];
cnt = 0;
for sz = ii
sz
cnt = cnt + 1;
inputArray = rand(sz);
columnVector = rand(sz, 1);
tic
bsxfun(@minus, inputArray, columnVector);
out(1) = toc;
tic;
inputArray - repmat(columnVector, [1, sz]);
out(2) = toc;
a(cnt,:) = out;
end
plot(ii,a);
legend({'bsxfun','repmat'});
ylabel('Elapsed time (s)')
xlabel('Array size')
That results in:
Titus Edelhofer
Titus Edelhofer 2014년 9월 26일
Nice comparison!
One aspect has not been mentioned yet: for larger matrices/vectors the memoryfriendliness of bsxfun compared to repmat (which blows up the memory usage significantly).
Titus
Good point. This can be done by adding these lines into the loop:
memoryUsed = memory;
fprintf('Memory used by MATLAB = %d bytes.\n', memoryUsed.MemUsedMATLAB)

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

추가 답변 (1개)

Guillaume
Guillaume 2014년 9월 25일
편집: Guillaume 2014년 9월 25일

1 개 추천

Use bsxfun, it will expands singleton dimensions:
n = 10; m = 20;
matrix = rand(n, m);
column = rand(n, 1);
bsxfun(@minus, matrix, column)

카테고리

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

제품

태그

질문:

2014년 9월 25일

댓글:

2014년 9월 26일

Community Treasure Hunt

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

Start Hunting!

Translated by