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 觉得有用的话,欢迎一起讨论相互学 ...
随机推荐
- Redis做消息队列文章两篇
介绍:http://www.cnblogs.com/lhfcws/p/3732535.html 具体做法:http://shift-alt-ctrl.iteye.com/blog/1867454 另外 ...
- Android中对JSONArray数组的指定项进行删除,更新。
首先假设有这么一个JSONArray JSONArray Array1;JSONArray ITEM = new JSONArray(); name为你获取要删除的字段名称,IETM就是你删除后得到的 ...
- [CareerCup] 1.2 Reverse String 翻转字符串
1.2 Implement a function void reverse(char *str) in C or C++ which reverses a null-terminated string ...
- JS闭包的理解
闭包的两个特点: 1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 其实上面两点可以合成一点,就是闭包函数返回时,该函数内部 ...
- poj1082-Calendar Game-博弈/sg
sg大法好 无脑sg即可,不用去找规律了. /*---------------------------------------------------------------------------- ...
- 使用mobile.changePage()时出现的问题(转)
使用mobile.changePage()页面跳转,当跳转到目标页面时,目标页面中的初始化js如$().ready()及其他引入的js都无法执 行,重新刷新页面后才会执行.想到changePage() ...
- xsd、wsdl生成C#类的命令行工具使用方法
1.xsd生成C#类命令 示例:xsd <xsd文件路径> /c /o:<生成CS文件目录> <其他参数> 参数说明: /c 生成为cs文件,/d 生成DataSe ...
- loadsh这个神奇的js工具类库
var _ = require('lodash'); 把几个对象合并为一个对象. _.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });// ➜ { 'a': 1, ...
- 分布式Web服务器架构
最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网 ...
- js获取url查询参数
function getURLParamInfo(key) { if (location.search == "") { return undefined; } var a = l ...