matlab学习笔记 bsxfun函数

最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下。

 

函数bsxfun

【功能描述】两个数组间元素逐个计算.

【应用场合】当我们想对一个矩阵A的每一列或者每一行与同一个长度相等的向量a进行某些操作(比较大小,乘除等)时,我们只能用循环方法或者利用repmat函数将要操作的向量a复制成和A一样尺寸的矩阵,进而进行操作。从MATLAB R2007a开始,再遇到类似的问题时,我们有了简洁高效的方法,即利用bsxfun函数。
【函数描述】C=bsxfun(fun,A,B):两个数组间元素逐个计算,fun是函数句柄或者m文件,也可以为如下内置函数 :
@plus 加 ;         @minus 减 ;         @times 数组乘 ;         @rdivide 左除 ;        @ldivide 右除 。

Example1: 将一个矩阵的每行或每列元素分别扩大不同的倍数

如[1 2 3;4 5 6 ;7 8 9],第一列元素乘以1,第二列元素以2,第三列元素乘以4。利用bsxfun函数,可以给出下列代码:

  1. <pre name="code" class="plain">a = [1,2,3;4,5,6;7,8,9];
  2. acol = bsxfun(@times,a,[1 2 4])

Example2:假设我们有一列向量和一行向量。

  1. <pre name="code" class="plain">a = randn(3,1);
  2. b = randn(1,3);
  3. a =
  4. 0.7516
  5. -0.8637
  6. -1.0709
  7. b =
  8. -0.3552    0.9559    0.1593

我们可以很简单的使用matlab的外乘来得到c=a*b,
  1. c = a * b
  2. c =
  3. -0.2670    0.7184    0.1197
  4. 0.3068   -0.8256   -0.1376
  5. 0.3804   -1.0236   -0.1706
	但如果我们想用”外加”呢?也就是说把上式求解过程中的乘号换做加号?这时我们可以用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)。这里,
  1. repmat(a,1,3)
  2. ans =
  3. -0.2453 -0.2453 -0.2453
  4. -0.2766 -0.2766 -0.2766
  5. -0.1913 -0.1913 -0.1913
repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于:
  1. for(i=1:3)
  2. for(j=1:3)
  3. c(i,j)=a(i)+b(j);
  4. end
  5. end
但bsxfun不会有使用matlab的for所带来额外时间。实际验证下这三种方式:
  1. >> c = bsxfun(@plus,a,b)
  2. c =
  3. 0.3609 0.3202 0.6604
  4. 0.3296 0.2889 0.6291
  5. 0.4149 0.3742 0.7144
  1. >> c = repmat(a,1,3)+repmat(b,3,1)
  2. c =
  3. 0.3609 0.3202 0.6604
  4. 0.3296 0.2889 0.6291
  5. 0.4149 0.3742 0.7144
  1. >> for(i=1:3)
  2. for(j=1:3)
  3. c(i,j)=a(i)+b(j);
  4. end
  5. end
  6. >> c
  7. c =
  8. 0.3609 0.3202 0.6604
  9. 0.3296 0.2889 0.6291
  10. 0.4149 0.3742 0.7144
从计算时间上来说前两种实现差不多,远高于for的实现。但如果数据很大,第二种实现可能会有内存上的问题。所以bsxfun最好。

参考:http://blog.sina.com.cn/s/blog_9e67285801010ttn.html

http://blog.sina.com.cn/s/blog_6ca002a50100wvu1.html

matlab学习笔记 bsxfun函数的更多相关文章

  1. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  2. matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...

  3. matlab学习笔记13_3创建函数句柄

    一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...

  4. matlab学习笔记13_2匿名函数

    一起来学matlab-matlab学习笔记13函数 13_2 匿名函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help/m ...

  5. matlab学习笔记---(1)

    Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...

  6. 【数学建模】MATLAB学习笔记——函数式文件

    MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...

  7. matlab学习笔记(一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

  8. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  9. matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct

    一起来学matlab-matlab学习笔记12 12_4 结构体 rmfield,arrayfun,structfun,struct2cell,cell2struct 觉得有用的话,欢迎一起讨论相互学 ...

随机推荐

  1. mousewheel 模拟滚动

    div{ box-sizing:border-box; } .father{ width:500px; height:400px; margin:auto; margin-top: 50px; bor ...

  2. .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结

    .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...

  3. 通信vue2.0组件

    vue2.0组件通信各种情况总结与实例分析   Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用p ...

  4. C#基础——谈谈.NET异步编程的演变史

    http://www.cnblogs.com/fzrain/p/3545810.html 前言 C#5.0最重要的改进,就是提供了更强大的异步编程.C#5.0仅增加两个新的关键字:async和awai ...

  5. WebSocket使用教程 2

    WebSocket使用教程 - 带完整实例 收藏 james_laughing 发表于 2年前 阅读 46438 收藏 23 点赞 5 评论 4 摘要: WebSocket使用教程 - 带完整实例 什 ...

  6. 如何下载struts 2及其各个包的作用

    一.http://archive.apache.org/dist/struts/library/ 二. struts官网: http://struts.apache.org/ 进入主页后点击" ...

  7. 20145215《Java程序设计》第7周学习总结

    20145215<Java程序设计>第七周学习总结 教材学习内容总结 Lambda 认识Lambda语法 Lambda语法概述: Arrays的sort()方法可以用来排序,在使用sort ...

  8. IT男的”幸福”生活"续8

    有段时间没写了,还是有点怀念的.   生活不记录下,怕真地会忘.. 以往的种种,时时刻刻回荡在我的脑海中,  最近看着孩子生活照, 猛得回首我便回了到了 续8. …… 坐在回去的公交车上,看着前面两M ...

  9. 嵌入式linux驱动开发之给linux系统添加温度传感器模块

    忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而 ...

  10. 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案

    引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...