一.问题来源

  来自于一份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])

Matlab中bsxfun和unique函数解析的更多相关文章

  1. MATLAB中trapz和cumtrapz函数

    这两个函数都是MATLAB中的内置函数,是基于梯形法则的数值积分公式 例如我们有函数y=x^3-2x-3,为了计算在[0,1]上的积分,可以这么做: 其中x和y分别是自变量和对应的值,trapz其实就 ...

  2. MATLAB中“repmat”与“cat”函数的用法

    MATLAB中“repmat”与“cat”函数的用法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. repmat函数 >> z=re ...

  3. matlab中的输出显示函数

    matlab中的输出显示函数 在matlab中使用的显示函数有disp.sprintf.fprintf比较常用.下面来介绍一下他们的用法. 1.disp()函数: disp(x)主要是用来输出变量x的 ...

  4. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...

  5. matlab中fopen 和 fprintf函数总结

    matlab中fopen函数在指定文件打开的实例如下: *1)"fopen"打开文件,赋予文件代号. 语法1:FID= FOPEN(filename,permission) 用指定 ...

  6. Matlab中rand('state',sum(clock))解析

    一.问题来源 来自于一份PSO代码,PSO中需要初始化粒子位置和速度. 二.问题探究 众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受.但是,如果我们知道伪随机数的初始 ...

  7. matlab中norm与svd函数用法

    格式:n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 以下是Matlab中help norm 的解释: NORM Matrix or vector ...

  8. matlab中同一文件定义子函数的方法

    在matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且M文件名必须和主函数相同在一个m文件中通常有两种定义子函数的方法: 1.嵌套定义 myfunc1会和主函数共享变量名.这种情况 ...

  9. oracle中next_day()、last_day()函数解析

    oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select   next_day(sysdate,1) from dual NEXT_DAY(date,char ...

随机推荐

  1. HTTP - 条件请求

    当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求.这样的请求首部有五个,分别是 If-Modified-Since.If-Unm ...

  2. RedirectFromLoginPage和FormsAuthenticationTicket的区别

    如果你对.net身份验证不是很清晰,请看本文.本文用简单明了的语言,让你对RedirectFromLoginPage和FormsAuthenticationTicket有一个完整的认识. 1)Form ...

  3. 软件包 java.util 的分层结构

    概述  软件包  类  使用   树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个   下一个 框架    无框架    所有类         ...

  4. jquery之音乐均衡器

    制作这个音乐均衡器需要一个equalizer插件(插件我已经上传),下面介绍一下网页的BGM的相关属性: hidden="true"表示隐藏播放,即不显示播放器的外观,若要想显示, ...

  5. Java垃圾回收介绍(译)

    在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...

  6. Objective-C 【在手动内存管理中如何写set方法】

    ------------------------------------------- set方法的内存管理 代码: #import <Foundation/Foundation.h> @ ...

  7. ubuntu grub配置

    一.Grub 2包含如下几部分内容:1./boot/grub/grub.cfg 文件2./etc/grub.d/ 文件夹3./etc/default/grub 文件 二.配置和意义: 1.修改grub ...

  8. swfupload使用说明

    网上的例子介绍的文档真的很多.下面简单介绍一下 SWFUpload的文件上传流程是这样的: 1.引入相应的js文件 2.实例化SWFUpload对象,传入一个配置参数对象进行各方面的配置. 3.点击S ...

  9. CSS3.0动画之hover---Y轴----3D旋转

    div#div2{display: table; width: 100%; height: 100%; text-decoration: none; outline: none; -webkit-tr ...

  10. wamp Server2.5 配置 自定义目录

    煎熬了两天终于找到了方法!!! 前提先改成中文 右键"W"图表-> Language -> chinese; 成功改为中文. 自定义目录步骤: 一.添加一个Alias ...