bsxfun
a = [1; 2; 3];
b = [2, 4, 6];
bsxfun(@plus,A,B)
ans =
3 5 7
4 6 8
5 7 9
其实bsxfun的功能是这样的:
bsxfun的执行是这样的,如果a和b的大小相同,那么c=a+b. 但如果有某维不同,且a或b必须有一个在这一维的维数为1, 那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样。在我们这里,b的第一维只有1(只一行),所以bsxfun将b复制3次形成一个3×3的矩阵,同样也将a复制成3×3的矩阵。这个等价于c=repmat(a,1,3)+repmat(b,3,1)。
首先是第一维不同,并且b的行为1,因此,将b进行行复制,变成
而对于a来说,其第二维和b的第二维不一样,并且a的第二维为1.因此将a扩展
相加后:
repmat
其实把,这个挺有意思的,就是将矩阵作为一个元素按照一定的方式排成一个新的矩阵。
比如:
B = repmat(A,m,n)
将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, size(A,2)*n] 。
>> A = [1,2;3,4]
A =
1 2
3 4
>> B = repmat(A,2,3)
B =
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4
区别
repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于
for(i=1:3)
for(j=1:3)
c(i,j)=a(i)+b(j);
end
end
for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。
但bsxfun不会有使用matlab的for所带来额外时间。