Matlab中bsxfun和unique函数解析

By | 04月15日
Advertisement

一.问题来源

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

Similar Posts:

  • [转载]MATLAB中测试程序运行时间的函数

    来源:http://www.matlabsky.com/thread-2607-1-1.html MATLAB中测试程序运行时间的函数 1. tic,toc TIC, operation, TOC 2. cputime t=cputime; your_operation; cputime-t 3. clock,etime t0 = clock; operation etime(clock,t0) 其中第一种最好. 经常我们需要计算我们程序到底运行多长时间,这样可以比较程序的执行效率.当然这个对于

  • MATLAB中的数据写入函数dlmwrite dlmread

    MATLAB中的数据写入函数dlmwrite dlmwrite 功能简介 将矩阵写入ASCII分隔的文件. 使用方法 1.dlmwrite(filename, M) 使用默认的分隔符(')将矩阵M写入ASCII格式的文件中.在目标文件filname中,数据是从第一行的第一列开始写的.输入的filename是使用单引号括起来的字符串. matlab 2.dlmwrite(filename, M, 'D') matabc 将矩阵M写入一个ASCII格式的文件中,使用分隔符D来分割矩阵的元素.在目标文

  • Matlab中几个数值积分函数的比较和优缺点

    一.Z = trapz(X,Y,dim) 梯形数值积分,通过已知参数x,y按dim维使用梯形公式进行积分 例1 计算int(sin(x),0,pi) %by dynamic %all rights reserved by www.matlabsky.com >>x=0:pi/100:2*pi; >>y=sin(x); >>z=trapz(x,y)%或者说使用z = pi/100*trapz(y) z = 1.0300e-017 >>z = pi/100*tr

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

    在matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且M文件名必须和主函数相同在一个m文件中通常有两种定义子函数的方法: 1.嵌套定义 myfunc1会和主函数共享变量名.这种情况下,使用相同的变量名,如果不是故意为之,就不合适了.function mainFunc(... a = myfunc1(); ... function myfunc1() ... end end 2. 非嵌套定义function mainFunc() ... a = myfunc1(); ... e

  • Matlab中有用的dos函数

    利用matlab中的dos函数,我们可以调用相当多的系统程序,比如 dos('taskmgr.exe') %调用任务管理器 dos('control.exe') %打开控制面板 dos('cleanmgr.exe') %磁盘清理 dos('cmd.exe') %命令提示符 dos('shutdown.exe -s -f -t 0') %立即关机 dos('shutdown.exe -r -f -t 0') %立即重启 dos('ping www.baidu.com') %ping命令 dos('

  • Matlab中处理连通域的函数家族

    我们在进行图像处理的时候经常会遇到对连通区域的一些操作,比如计算连通域面积.对连通域计数等,对于这类问题很多人会没有思路不知所措,好在Matlab工具箱给提供了这些基本的函数,实在是方便了不少啊!如果想知道算法原理,只需要查看响应函数的源代码即可.废话不多说,让我们一一来看这些常用的函数吧~ 1. matlab函数bwareaopen──删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域. 算法: (1)D

  • Matlab中的傅里叶级数展开函数

    今天在用Matlab(2012b)计算的时候发现其中的函数库没有直接提供傅里叶级数展开的函数,就自己搞了一个 function [A,B,F]=fseries(f,x,n,a,b) %用于求解函数的傅里叶级数展开 if nargin==3, a=-pi; b=pi; end L=(b-a)/2; if a+b, f=subs(f,x,x-L-a); end %变量区域互换 A=int(f,x,-L,L)/L; B=[]; F=A/2; %计算a0 for i=1:n an=int(f*cos(i

  • matlab中sparse和full函数的使用

    sparse函数 功能:创建稀疏矩阵 用法1:S=sparse(X)-将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩阵S. 如果X本身是稀疏的,sparse(X)返回S. 举例如下: 1 >> a=[1,0,2;0,0,1;0,0,6]; 2 >> a 3 4 a = 5 6 1 0 2 7 0 0 1 8 0 0 6 9 10 >> b=sparse(a) 11 12 b = 13 14 (1,1) 1 15 (1,3) 2 1

  • Matlab中的几个函数

    zeros函数--生成零矩阵 [zeros的使用方法] B=zeros(n):生成n×n全零阵. B=zeros(m,n):生成m×n全零阵. B=zeros([m n]):生成m×n全零阵. B=zeros(d1,d2,d3--):生成d1×d2×d3×--全零阵或数组. B=zeros([d1 d2 d3--]):生成d1×d2×d3×--全零阵或数组. B=zeros(size(A)):生成与矩阵A相同大小的全零阵. fopen函数--打开文件 最常用的调用形式: fileID = fop

  • mat2gray、fspecial等matlab中的常用函数

    前言:本博文用于记录matlab中一些常见的函数,以便备忘,会持续更新. 1.mat2gray():用来归一化二维矩阵的,这在图像处理中会经常用得到,详情请查看其MATLAB源代码. 在MATLAB中输入一个3*3大小的矩阵,经mat2gray()之后得到一个归一化后的矩阵.语句如下: >> a=[1,2,3;2,3,4;3,4,5] a = 1 2 3 2 3 4 3 4 5 >> b=mat2gray(a) b = 0 0.2500 0.5000 0.2500 0.5000 0

Tags: