Matlab bsxfun函数

bsxfun

两个数组间元素逐个计算.


语法:

C=bsxfun(fun,A,B)


函数描述:

两个数组间元素逐个计算,fun是函数句柄或者m文件,也可以为如下内置函数

@plus               Plus
@minus           Minus
@times            Array multiply
@rdivide          Right array divide
@ldivide           Left array divide
@power           Array power
@max              Binary maximum
@min              Binary minimum
@rem              Remainder after division
@mod            Modulus after division
@atan2          Four quadrant inverse tangent
@hypot          Square root of sum of squares
@eq               Equal
@ne               Not equal
@lt                  Less than
@le                 Less than or equal to
@gt                 Greater than
@ge               Greater than or equal to
@and             Element-wise logical AND
@or                 Element-wise logical OR
@xor               Logical exclusive OR

当我们想对一个矩阵A的每一列或者每一行与同一个长度相等的向量a进行某些操作(比较大小,乘除等)时,我们只能用循环方法或者利用repmat函数将要操作的向量a复制成和A一样尺寸的矩阵,进而进行操作。 


举例:

1、利用bsxfun函数使矩阵A的每个元素减去所在列的均值

>> A=[1 2 5;3 5 6;2 8 7];
>> C=bsxfun(@minus,A,mean(A))


C =


    -1    -3    -1
     1     0     0
     0     3     1

2、矩阵的每行或每列元素分别扩大不同的倍数,如令矩阵A的第一列元素乘以1,第二列元素以2,第三列元素乘以4

>> A = [1,2,3;4,5,6;7,8,9];
>> C = bsxfun(@times,A,[1 2 4])

C =

     1     4    12
     4    10    24
     7    16    36

3、@plus实现维数不同的矩阵相加

>> A=rand(3,1)

A =

    0.9549
    0.0380
    0.9789

>> B=rand(1,3)

B =

    0.7888    0.9839    0.5633

>> C=bsxfun(@plus,A,B)

C =

    1.7436    1.9387    1.5182
    0.8268    1.0219    0.6013
    1.7677    1.9628    1.5423
      这里bsxfun是这样执行的,如果A和B的大小相同,那么C=A+B。 但如果有某维不同,且A或B必须有一个在这一维的维数为1, 那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样。在我们这里,b的第一维只有1(只一行),所以bsxfun将b复制3次形成一个3×3的矩阵,同样也将a复制成3×3的矩阵。

即A会复制成                                          

    0.9549    0.9549    0.9549
    0.0380    0.0380    0.0380
    0.9789    0.9789    0.9789

   B会复制成

    0.7888    0.9839    0.5633
    0.7888    0.9839    0.5633
    0.7888    0.9839    0.5633

最后将以上两个复制后的矩阵相加得到C。

这个等价于C=repmat(A,1,3)+repmat(B,3,1)。


你可能感兴趣的:(Matlab)