matlab函数 bsxfun(高效代码)

转自 点击打开链接

bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-by-element binary operation to arrays a and b, with singleton expansion enabled.”

函数功能:两个数组间元素逐个计算的二值操作

使用方法:C=bsxfun(fun,A,B)

两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数:

@plus 加
@minus 减
@times 数组乘《Simulink与信号处理》
@rdivide 左除
@ldivide 右除
@power 数组幂乘
@max 二值最大值
@min 二值最小值
@rem 余数
@mod 求模
@atan2 四象限反正切
@hypot 平方和的平方根
@eq 等于
@ne 不等于
@lt 小于www.iLoveMatlab.cn
@le 小于或等于
@gt 大于
@ge 大于或等于
@and 逻辑并
@or 逻辑或
@xor 逻辑异或

三种方法对比:

[cpp]  view plain  copy
 print ?
  1. function test_dist(m, n)  
  2.     X = rand(m,n);  
  3.     D = use_bsxfun(X);  
  4.     D = use_repmat(X);  
  5.     D = use_for(X);  
  6. end  
  7.   
  8. function D=use_bsxfun(X)  
  9.     v = dot(X,X);  
  10.     D = bsxfun(@plus,v,v')-2*(X'*X);  
  11. end  
  12.   
  13. function D=use_repmat(X)  
  14.     v = dot(X,X);  
  15.     D = repmat(v,length(v),1) + repmat(v',1,length(v)) - 2*(X'*X);  
  16. end  
  17.   
  18. function D=use_for(X)  
  19.     D = zeros(size(X,2));  
  20.     for i=1:size(D,1)  
  21.         for j=i+1:size(D,2)  
  22.             D(i,j) = sum((X(:,i)-X(:,j)).^2);  
  23.         end  
  24.     end  
  25.     D = max(D,D');  
  26. end  

应用举例:

假设我们有数据A和B, 每行是一个样本,每列是一个特征。我们要计算高斯核,既:
k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。
当然可以用双重for实现(如果第一直觉是用三重for的话…)。

K1 = zeros(size(A,1),size(B,1));
for i = 1 : size(A,1)
  for j = 1 : size(B,1)
    K1(i,j) = exp(-sum((A(i,:)-B(j,:)).^2)/beta);
  end
end

使用2,000×1,000大小的A和B, 运行时间为88秒。
考虑下面向量化后的版本:

sA = (sum(A.^2, 2));
sB = (sum(B.^2, 2));
K2 = exp(bsxfun(@minus,bsxfun(@minus,2*A*B', sA), sB')/beta);

使用同样数据,运行时间仅0.85秒,加速超过100倍。
如要判断两者结果是不是一样,可以如下

assert(all(all(abs(K1-K2)<1e-12)))
C = bsxfun(fun,A,B) appliesthe element-by-element binary operation specified 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bsxfun函数Matlab中的一个函数,用于对两个数组进行二元操作。它的作用是将两个数组进行广播,使它们的维度相同,然后再进行二元操作。这个函数的语法格式为: C = bsxfun(fun,A,B) 其中,fun是一个函数句柄,用于指定二元操作的函数;A和B是两个数组,可以是向量、矩阵或多维数组。函数的返回值C是一个与A和B维度相同的数组,其中每个元素都是对应位置上A和B的元素进行fun操作的结果。 bsxfun函数的优点是可以避免使用循环,提高代码的运行效率。它常用于矩阵运算、图像处理等领域。 ### 回答2: bsxfunMATLAB中一种非常有用的函数,它的全称为Binary Singleton Expansion Function。BSXFUN函数主要用于两个数组之间的处理,它能够将两个数组进行大小转换和广播,然后再进行相应的运算。BSXFUN函数可以对两个维度不同的数组进行运算,功能强大,可以大大提高数组运算的效率。 BSXFUN函数的用法与MATLAB中的矩阵运算非常类似,它可以是用运算符(+,-,*,/)来进行数组的运算。在进行运算时,BSXFUN函数将对输入数组进行广播操作,将输入数组扩展至相同的维数,然后进行相应的运算。这样就非常方便,可以省去了输入数组大小一致的繁琐操作。 需要注意的是,BSXFUN函数可以广播数组到任意大小,这样可能会影响运算的性能。因此,在使用BSXFUN函数时,我们应该尽量避免使用过多的广播,以免影响程序的运行效率。 另外,需要注意的是,BSXFUN函数不能用于所有的运算,它只能用于一些特定的运算,例如加法和减法。对于其他类型的运算,我们需要使用其他的函数来实现。 总之,BSXFUN函数MATLAB中一种非常有用的函数,它可以大大提高数组的运算效率,减少了输入数组大小一致的繁琐操作。在使用BSXFUN函数时,我们需要注意广播数组的大小,以免影响程序的运行效率。 ### 回答3: bsxfun函数是一个在Matlab中非常有用的函数,可以帮助用户对多维数组进行各种运算。bsxfun的全称是Binary Singleton Expansion Function,它的作用是处理两个输入矩阵,使得它们具有相同的大小,以便能够进行各种运算。 bsxfun函数的语法格式如下: C = bsxfun(fun,A,B) 其中,fun是指封装函数的句柄,A和B是输入的矩阵,C是结果矩阵。 bsxfun函数的作用是将矩阵A与矩阵B进行运算,如相加、相减、相乘等。如果A和B的维数不同,bsxfun函数会自动将较小的矩阵在某一个维度上进行扩展,使它们具有相同的大小。例如,将一个1×3向量加上一个3×1向量,可以使用bsxfun函数实现: a = [1 2 3]; b = [4; 5; 6]; c = bsxfun(@plus,a,b); 运行结果为: c = [5 6 7; 6 7 8; 7 8 9]; bsxfun函数还可以扩展到更多的维度,比如三维、四维甚至更高维度的数组。同时,bsxfun函数还可以结合匿名函数进行操作,比如: a = [1 2; 3 4]; b = [5 6; 7 8]; c = bsxfun(@(x,y) x.^y,a,b); 运行结果为: c = [1 64; 2187 65536]; 以上就是bsxfun函数的一些基础用法。总之,bsxfun函数是一个非常强大的Matlab函数,可以大大简化矩阵运算的编写过程,同时也应用非常广泛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值