博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab学习笔记 bsxfun函数
阅读量:6453 次
发布时间:2019-06-23

本文共 1876 字,大约阅读时间需要 6 分钟。

最近总是遇到 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函数,可以给出下列代码:

[plain] 
 
  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:假设我们有一列向量和一行向量。

[plain] 
 
  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,
[plain] 
 
  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)。这里,
[plain] 
 
  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来实现,等效于:
[plain] 
 
  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所带来额外时间。实际验证下这三种方式:
[plain] 
 
  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   
[plain] 
 
  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   
[plain] 
 
  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

转载地址:http://aqyzo.baihongyu.com/

你可能感兴趣的文章
阿里Java完整学习资料
查看>>
建立本地repo 管理仓库
查看>>
.Net转Java自学之路—基础巩固篇十(异常)
查看>>
详解redis服务
查看>>
数据结构之--单链表MyArrayList
查看>>
java基础练习2
查看>>
文件操作总结
查看>>
两队选手每队5人进行一对一的比赛(算法)
查看>>
eclipse : Error while performing database login with the driver null
查看>>
【语法】数组Array
查看>>
WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
查看>>
vue elementUI之Form表单 验证
查看>>
Android程序完全退出的三种方法
查看>>
依赖注入和控制反转
查看>>
权限体系构建 - 平台权限
查看>>
线性表5 - 数据结构和算法10
查看>>
电子脉冲示例图
查看>>
通过cmp 指令执行后,相关标志位的值就可以看出比较的结果
查看>>
变量的原理
查看>>
Poj 1017 / OpenJudge 1017 Packets/装箱问题
查看>>