简体   繁体   中英

Matlab equivalent of Numpy broadcasting?

I'm trying to find some way to substract a size 3 vector from each column of a 3*(a big number) matrix in Matlab. Of course I could use a loop, but I'm trying to find some more efficient solution, a bit like numpy broadcasting. Oh, and I can't use repmat because I just don't have enough memory to use it (as it creates yet another 3*(a big number) matrix)...

Is this possible?

Loops aren't bad in MATLAB anymore thanks to compiler optimizations like just-in-time acceleration (JITA) . etc. Most of the time, I've noticed that a solution with loops in current MATLAB versions is much faster than complicated (albeit, cool :D) one-liners.

bsxfun might do the trick but in my experience, it tends to have memory issues as well but less so than repmat .

So the syntax would be:

AA = bsxfun(@minus,A,b) where b is the vector and A is your big matrix

But I urge you to profile the loopy version and then decide! Most probably, due to memory constraints, you might not have a choice :)

The other answers are a bit out of date -- Matlab R2016b appears to have added broadcasting as a standard feature . An example from that blog post that matches the question:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6

I don't know if this will speed up the code, but subtraction of a scalar from a vector doesn't have memory issues. Since your matrix size is so asymmetrical, the overhead from a for-loop on the short dimension is negligible.

So maybe

matout = matin;
for j = 1:size(matin, 1) %3 in this case
     matout(j,:) = matin(j,:) - vec_to_subtract(j);
end

of course, you could do this in place, but I didn't know if you wanted to preserve the original matrix.

实际上,似乎http://www.frontiernet.net/~dmschwarz/genops.html (运算符重载mex文件)也可以做到这一点,即使我还没有测试过它。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM