Subtracting Vector from a Matrix
79 次查看(过去 30 天)
显示 更早的评论
I have the matrix a (8x1001) and b (1x1001) as in attached.
a and b can change in size.
How do I substract b from each row of a and put in a new matrix c?
Thanks.
0 个评论
采纳的回答
Jan
2019-11-21
Matlab can subtract vectors from matrices automatically since R2016b - so called "auto expanding". Do you use an older version? Then:
c = bsxfun(@minus, a, b)
5 个评论
Jan
2019-11-21
@Adam: While repmat is (or at least was) an M-function, you can omit the overhead:
c = a - b(ones(1, 8), :);
Adam Danz
2019-11-21
编辑:Adam Danz
2019-11-21
Good idea, Jan. I would have expected the ones() method to be faster than repmat(), too. But I timed both methods 500000 times and it turns out that the repmat() is actually faster. I repeated this a few times with consistent results. The boxplots below show the results of the 500k reps with outliers removed.
a = repmat((1:8)',1,12);
b = repmat(2,1,12);
% Method 1 (red)
c = a - b(ones(1, 8), :);
% Method 2 (blue)
d = a - repmat(b,size(a,1),1);
And including the outliers
Who knows what's going on in either function (closed source).
更多回答(1 个)
Adam Danz
2019-11-21
"How do I substract b from each row of a and put in a new matrix c?"
As long as the number of columns in b matches the number of columns in a
c = a - b;
Demo:
% Create data
a = repmat((1:8)',1,12);
b = repmat(2,1,12);
c = a - b;
3 个评论
Jan
2019-11-21
Obviously the sizes are not matching. Trust Matlab. See:
size(a)
size(b)
What do you get?
Adam Danz
2019-11-21
编辑:Adam Danz
2019-11-21
See the 2nd line of my answer:
As long as the number of columns in b matches the number of columns in a
This requirement is met for the data you provided in matrix a and matrix b in your mat files.
load('a.mat')
load('b.mat')
size(a) % 8 1001
size(b) % 1 1001
c = a-b;
size(c) % 8 1001
If that requirement is not met, you cannot perform matrix subtraction without defining how you plan to resolve the size mismatch.
[update]
If your matlab release is prior to r2016a, see Jan's answer which avoids implicit expansion. This is why it's always good to include your matlab release in the field where it is requested while writing your question.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!