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

举个例子。假设我们有一列向量和一行向量。

a = randn(3,1), b = randn(1,3) a = -0.2453 -0.2766 -0.1913 b = 0.6062 0.5655 0.9057
我们可以很简单的使用matlab的外乘c=a*b来得到,如图
但如果我们想用”外加”呢?也就是说把上式求解过程中的乘号换做加号?
这时我们可以用c=bsxfun(@plus,a,b)来实现。
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)。这里
repmat(a,1,3) ans = -0.2453 -0.2453 -0.2453 -0.2766 -0.2766 -0.2766 -0.1913 -0.1913 -0.1913
repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不会有使用matlab的for所带来额外时间。实际验证下这三种方式
>> c = bsxfun(@plus,a,b) c = 0.3609 0.3202 0.6604 0.3296 0.2889 0.6291 0.4149 0.3742 0.7144 >> c = repmat(a,1,3)+repmat(b,3,1) c = 0.3609 0.3202 0.6604 0.3296 0.2889 0.6291 0.4149 0.3742 0.7144 >> for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end,c c = 0.3609 0.3202 0.6604 0.3296 0.2889 0.6291 0.4149 0.3742 0.7144
从计算时间上来说前两种实现差不多,远高于for的实现。但如果数据很大,第二种实现可能会有内存上的问题。所以bsxfun最好。这里@plus是加法的函数数柄,相应的有减法@minus, 乘法@times, 左右除等,具体可见 doc bsxfun.下面看一个更为实际的情况。假设我们有数据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 by the functionhandlefun to arrays A and B,with singleton expansion enabled.fun can be oneof the following built-in functions:

@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

matlab中 bsxfun函数相关推荐

  1. 多功能运算求解器_matlab中bsxfun函数

    多功能运算求解器----matlab中bsxfun函数 [学习背景] 在我学习高斯函数中,看到了out=bsxfun(@times, x, w )这么一句程序,这引起了我的好奇,因而查看了matlab ...

  2. Matlab中bwmorph函数的使用

    Matlab中bwmorph函数的使用 Matlab中提供了一个基于形态学的处理函数,即以膨胀.腐蚀等操作为基础,其语法格式如下: bw2=bwmorph(bw1,operation,n); 其中bw ...

  3. 9.matlab中repmat函数

    来源: matlab中repmat函数的用法 - CSDN博客 https://blog.csdn.net/anqier1009/article/details/5214978 B = repmat( ...

  4. 如何在Matlab中获取函数参数的数目?

    本图文详细介绍了Matlab中获取函数参数数目的方法.

  5. matlab s% d%,matlab中var函数的翻译For N-D arrays, VAR operates along the first

    matlab中var函数的翻译For N-D arrays, VAR operates along the first matlab中var函数的翻译 For N-D arrays, VAR oper ...

  6. 关于MATLAB中xlswrite函数写数据出现服务器异常情况的解决办法

    关于MATLAB中xlswrite函数写数据出现服务器异常情况的解决办法 参考文章: (1)关于MATLAB中xlswrite函数写数据出现服务器异常情况的解决办法 (2)https://www.cn ...

  7. Matlab中Ksdensity()函数的用途 (2011-04-02 16:55:17)

    Matlab中Ksdensity()函数的用途 (2011-04-02 16:55:17) 转载▼ 标签: 杂谈 分类: Matlab应用 我们在统计数据处理时,经常计算一个样本的概率密度估计,也就是 ...

  8. cumsum在matlab中,matlab中cumsum函数和sum函数详解

    调用格式及说明 matlab中cumsum函数通常用于计算一个数组各行的累加值.在matlab的命令窗口中输入doc cumsum或者help cumsum即可获得该函数的帮助信息. 调用格式及说明 ...

  9. matlab中fprintf函数的具体使用方法

    matlab中fprintf函数的具体使用方法实例如下: fprintf函数可以将数据按指定格式写入到文本文件中.其调用格式为: 数据的格式化输出:fprintf(fid, format, varia ...

最新文章

  1. 4.3.6 无分类编址CIDR
  2. cnblogs客户端发贴解析,Post,Get分析
  3. 求到所有房子距离和最小的新房子
  4. 数字媒体播放器行业调研报告 - 市场现状分析与发展前景预测
  5. ubuntu 18.04 卸载 mysql 过程记录
  6. 滚动条----SCROLLBAR
  7. 亿图图示输入文字后画面自动缩小
  8. python身份证区域分割_python 身份证归属地解析
  9. 中国实业能成为怎样的互联网公司
  10. 史上最新最全的ADB命令行
  11. C语言谭浩强第三版第九章例题及课后题:预处理命令
  12. Linux系统 ·虚拟机安装· SecureCRT远程连接器
  13. 怎么卸载mysql????如何清理干净?
  14. Dart - function
  15. 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...
  16. CADe_SIMu V1.0.0.1手把手学习笔记(4)
  17. 美赞臣EDI 940仓库装运订单详解
  18. php 7.0 readfile_php readfile下载大文件失败的解决方法
  19. 转|地理数据下载的网站汇总 全国地研联 测绘学报 2018-12-05
  20. PL/SQL Developer 下载

热门文章

  1. Visual Studio 2005 中的 命令窗口
  2. VS2005控制台程序修改nb0文件
  3. python mysql 编码方式,Python3编码与mysql编码介绍
  4. mysql uuid 性能_mysql InnoDB UUID 主键 性能优化【性能分析篇】.md
  5. 安装VMWare时 the system administrator has set policies to prevent this installation
  6. Git的学习与使用(五)——Git 创建仓库
  7. Swift实现CoreData存储数据
  8. 围棋人机大战明日上演,这份观赛指南请留好
  9. 安装Eclipse插件
  10. ubuntu服务器mysql管理 第一弹