来自于一份LSH代码,记录下来。html
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函数。app
格式 b = unique (a) %取集合a的不重复元素构成的向量。
b = unique (A,'rows') %返回A、B不一样行元素组成的矩阵。ide
我发现b中内容由小到大排序了。函数
[b,i,j] = unique (…) %i体现b中元素在原向量(矩阵a)中的位置;j体现原向量(矩阵a)在b中的位置spa
参考文献:http://blog.sina.com.cn/s/blog_5efed5800100crs2.htmlhtm
举个例子。假设咱们有一列向量和一行向量。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)。blog
这里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
>> 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])