zoukankan      html  css  js  c++  java
  • Matlab中bsxfun和unique函数解析

    一.问题来源

      来自于一份LSH代码,记录下来。

    二.函数解析

    2.1 bsxfun

      bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-by-element binary operation to arrays a and b, with singleton expansion enabled。

      函数用在两个数组间元素逐个计算。比如当我们想对一个矩阵A的每一列或者每一行与同一个长度相等的向量a进行某些操作(比较大小,乘除等)时,我们只能用循环方法或者利用repmat函数将要操作的向量a复制成和A一样尺寸的矩阵,进而进行操作。从MATLAB R2007a开始,再遇到类似的问题时,我们有了简洁高效的方法,即利用bsxfun函数。

    2.2 unique

      格式 b = unique (a) %取集合a的不重复元素构成的向量。
      b = unique (A,'rows') %返回A、B不同行元素组成的矩阵。

      我发现b中内容由小到大排序了。

      [b,i,j] = unique (…) %i体现b中元素在原向量(矩阵a)中的位置;j体现原向量(矩阵a)在b中的位置

      参考文献:http://blog.sina.com.cn/s/blog_5efed5800100crs2.html

    三.实例分析

    3.1 bsxfun  

      举个例子。假设我们有一列向量和一行向量。a = randn(3,1), b = randn(1,3),我们可以很简单的使用matlab的外乘c=a*b来得到,但如果我们想用”外加”呢?也就是说把上式求解过程中的乘号换做加号?
    这时我们可以用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是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不会有使用matlab的for所带来额外时间。从计算时间上来说前两种实现差不多,远高于for的实现。但如果数据很大,第二种实现可能会有内存上的问题。所以bsxfun最好。

      这里@plus是加法的函数数柄,相应的有减法@minus, 乘法@times, 左右除等,具体可见 doc bsxfun.也可以是m文件。

      @plus@minus@times@rdivide@ldivide@power@max@min@rem@mod@atan2@hypot@eq@ne@lt@le@gt@ge@and@or@xor

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

    3.2rempat

    >> A=[1 1 2 2 4 4 6 4 6]
    A =
    1 1 2 2 4 4 6 4 6
    >> [c,i,j]=unique(A)
    c =
    1 2 4 6
    i =
    2 4 8 9 %i体现b中元素在原向量(矩阵a)中的位置;
    j =
    1 1 2 2 3 3 4 3 4 %j体现原向量(矩阵a)在b中的位置

    例1-40
    >> A=[1 2 2 4;1 1 4 6;1 1 4 6]
    A =
    1 2 2 4
    1 1 4 6
    1 1 4 6
    >> [c,i,j]=unique(A,'rows')
    c =
    1 1 4 6
    1 2 2 4
    i =
    3
    1
    j =
    2
    1
    1  

      如何将一个矩阵的每行或每列元素分别扩大不同的倍数?如[1 2 3;4 5 6 ;7 8 9],第一列元素乘以1,第二列元素以2,第三列元素乘以4。

      利用bsxfun函数,可以给出下列代码:a = [1,2,3;4,5,6;7,8,9];acol = bsxfun(@times,a,[1 2 4])

  • 相关阅读:
    Numpy学习笔记练习代码 ——(二)
    Requests爬取表格数据并存入CSV中
    Numpy学习练习代码 ——(一)
    Requests爬取中文网站乱码问题
    Pycharm用Ctrl+鼠标滚轮控制字体大小
    一、Windows10下python3和python2同时安装
    inux下配置rsyncd服务
    shell 脚本中$$,$#,$?分别代表什么意思?
    linux shell awk 流程控制语句(if,for,while,do)详细介绍
    定时任务
  • 原文地址:https://www.cnblogs.com/hxsyl/p/4429316.html
Copyright © 2011-2022 走看看