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函数,可以给出下列代码:
- <pre name="code" class="plain">a = [1,2,3;4,5,6;7,8,9];
- acol = bsxfun(@times,a,[1 2 4])
Example2:假设我们有一列向量和一行向量。
- <pre name="code" class="plain">a = randn(3,1);
- b = randn(1,3);
- a =
- 0.7516
- -0.8637
- -1.0709
- b =
- -0.3552 0.9559 0.1593
我们可以很简单的使用matlab的外乘来得到c=a*b,
- c = a * b
- c =
- -0.2670 0.7184 0.1197
- 0.3068 -0.8256 -0.1376
- 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)。这里,
- 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最好。
参考:http://blog.sina.com.cn/s/blog_9e67285801010ttn.html
http://blog.sina.com.cn/s/blog_6ca002a50100wvu1.html
matlab学习笔记 bsxfun函数的更多相关文章
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- matlab学习笔记13_1 函数返回值
一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...
- matlab学习笔记13_3创建函数句柄
一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...
- matlab学习笔记13_2匿名函数
一起来学matlab-matlab学习笔记13函数 13_2 匿名函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help/m ...
- matlab学习笔记---(1)
Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...
- 【数学建模】MATLAB学习笔记——函数式文件
MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...
- matlab学习笔记(一)单元数组
matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x) :取最大的整数 ceil(3.18)=4,ceil( ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- matlab学习笔记12_4rmfield,arrayfun,structfun,struct2cell,cell2struct
一起来学matlab-matlab学习笔记12 12_4 结构体 rmfield,arrayfun,structfun,struct2cell,cell2struct 觉得有用的话,欢迎一起讨论相互学 ...
随机推荐
- mousewheel 模拟滚动
div{ box-sizing:border-box; } .father{ width:500px; height:400px; margin:auto; margin-top: 50px; bor ...
- .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
.Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...
- 通信vue2.0组件
vue2.0组件通信各种情况总结与实例分析 Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用p ...
- C#基础——谈谈.NET异步编程的演变史
http://www.cnblogs.com/fzrain/p/3545810.html 前言 C#5.0最重要的改进,就是提供了更强大的异步编程.C#5.0仅增加两个新的关键字:async和awai ...
- WebSocket使用教程 2
WebSocket使用教程 - 带完整实例 收藏 james_laughing 发表于 2年前 阅读 46438 收藏 23 点赞 5 评论 4 摘要: WebSocket使用教程 - 带完整实例 什 ...
- 如何下载struts 2及其各个包的作用
一.http://archive.apache.org/dist/struts/library/ 二. struts官网: http://struts.apache.org/ 进入主页后点击" ...
- 20145215《Java程序设计》第7周学习总结
20145215<Java程序设计>第七周学习总结 教材学习内容总结 Lambda 认识Lambda语法 Lambda语法概述: Arrays的sort()方法可以用来排序,在使用sort ...
- IT男的”幸福”生活"续8
有段时间没写了,还是有点怀念的. 生活不记录下,怕真地会忘.. 以往的种种,时时刻刻回荡在我的脑海中, 最近看着孩子生活照, 猛得回首我便回了到了 续8. …… 坐在回去的公交车上,看着前面两M ...
- 嵌入式linux驱动开发之给linux系统添加温度传感器模块
忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而 ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...