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. C# is as

    if(obj is ClassA) //遍历类层次,看OBJ是不是ClassA类型{    ClassA a=(ClassA) obj; //遍历类层次,看obj能否转换为ClassA,不成功则抛出异 ...

  2. Microsoft Visual Studio 正忙

    简介:Microsoft Visual Studio 正忙,Microsoft Visual Studio 正在等待内部操作完成.如果经常在正常使用的情况下遇到此延迟, 请向Microsoft报告此情 ...

  3. Web消息主体风格(Message Body Style)

    对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttr ...

  4. jQuery.smoove — jQuery和CSS3炫酷滚动页面内容元素动画特效插件

    插件介绍: jQuery-smoove是一款jQuery和CSS3炫酷滚动页面内容元素动画特效插件.该内容元素动画插件在页面滚动到指定位置时,该位置的HTML元素会执行指定的CSS3动画特效,如旋转. ...

  5. Opencv step by step - 鼠标事件

    鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...

  6. 学习笔记——Maven实战(五)自动化Web应用集成测试

    自动化集成测试的角色 本专栏的上一篇文章讲述了Maven与持续集成的一些关系及具体实践,我们都知道,自动化测试是持续集成必不可少的一部分,基本上,没有自动化测试的持续集成,都很难称之为真正的持续集成. ...

  7. .NET MVC框架中控制器接收参数的四种方式

    1.通过路由中的配置的参数名字直接接收(要求:两者同名) routes.MapRoute(                 name: "Default",             ...

  8. jQuery ajax - get(),getJSON(),post()方法

    1)       jQuery ajax - get() 方法: $(selector).get(url,data,success(response,status,xhr),dataType) 参数 ...

  9. python3 入门 (二) 列表的使用

    列表用于组织其它数值,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. 列表的定义 student = ['Tom', 'Jack', 'Avril'] 添加元素 将另一个列 ...

  10. 从数据包谈如何封杀P2SP类软件

    概述 1.1背景介绍 我们经常在用户的网络中发现大量的P2P应用,占用了网络中大量的宝贵带宽资源,用户的网络管理者也知道内网中存在这些应用,也采取了一些限制措施,但是效果并不一定理想.本文试着以数据包 ...