无意中遇到的bsxfun函数—matlab
2016-01-07 09:37
274 查看
原链接:点击打开链接
这个函数对于学习大数据算法的人来说,不得不赞啊!
【函数描述】C=bsxfun(fun,A,B):两个数组间元素逐个计算,fun是函数句柄或者m文件,也可以为如下内置函数
@plus
加
@minus
减
@times
数组乘
@rdivide
左除
@ldivide
右除
由于本人在学习中无意中遇到bsxfun函数,起初是看了帮助文档的。Apply element-by-element binary operation to two arrays with singleton expansion enabled……
C = bsxfun(fun,A,B) applies an element-by-element binary operation to arrays A and B, with singleton expansion enabled. The inputs must be of the following types: numeric, logical, char, struct, cell.fun is a function handle, and can either be an MATLAB-function
or one of the following built-in functions。两个数组间元素逐个计算的二值操作
举个例子,实践出真知。假设我们有一列向量和一行向量:
a = randn(3,1), b = randn(1,3)
将两者进行矩阵相乘,即所谓的外乘。c=a*b;这是在线性代数中常见的矩阵相乘。但如果我们想用”外加”呢?这时我们可以用c=bsxfun(@plus,a,b)来实现。此语句也可以用以下的repmat来实现。a1=repmat(a,1,3); b1=repmat(b,3,1);这是将矩阵沿着某个方向进行复制。在将代码实现后可以看到效果的。若原来生成的b矩阵是 0.8622 0.3188 -1.3077,则b1的结果如下:
0.8622 0.3188 -1.3077
0.8622 0.3188 -1.3077
0.8622 0.3188 -1.3077
如果a和b的大小相同,那么c=a+b。但如果有某维不同,且a或b必须有一个在这一维的维数为1, 那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样。repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不会有使用matlab的for所带来额外时间。
测试程序:
clc;
clear all;%
tic;
I_g = imread('a.tif');%
a=I_g;
a=I_g(:,1);
I_t=imread('b.tif');%
b=I_t;
b=I_t(1,:);
[m n]=size(I_t);
tic
% for(i=1:m),
% for(j=1:n),
% c(i,j)=a(i)+b(j);
% end,
% end
% c;
% t0=toc
% tic
% c1=bsxfun(@plus,a,b);
% t1=toc
% tic
c2=repmat(a,1,n)+repmat(b,m,1);
t2=toc
其实根据结果还是有些不同的。使用bsxfun函数是最快的,for循环是次快的,最慢的是使用repmat来实现。从计算时间上来说前两种实现差不多,远高于repmat的实现。但如果数据很大时,不管是从时间还是从内存上来讲,选用bsxfun最好。本人对于大数据也实践过。
这个函数对于学习大数据算法的人来说,不得不赞啊!
【函数描述】C=bsxfun(fun,A,B):两个数组间元素逐个计算,fun是函数句柄或者m文件,也可以为如下内置函数
@plus
加
@minus
减
@times
数组乘
@rdivide
左除
@ldivide
右除
由于本人在学习中无意中遇到bsxfun函数,起初是看了帮助文档的。Apply element-by-element binary operation to two arrays with singleton expansion enabled……
C = bsxfun(fun,A,B) applies an element-by-element binary operation to arrays A and B, with singleton expansion enabled. The inputs must be of the following types: numeric, logical, char, struct, cell.fun is a function handle, and can either be an MATLAB-function
or one of the following built-in functions。两个数组间元素逐个计算的二值操作
举个例子,实践出真知。假设我们有一列向量和一行向量:
a = randn(3,1), b = randn(1,3)
将两者进行矩阵相乘,即所谓的外乘。c=a*b;这是在线性代数中常见的矩阵相乘。但如果我们想用”外加”呢?这时我们可以用c=bsxfun(@plus,a,b)来实现。此语句也可以用以下的repmat来实现。a1=repmat(a,1,3); b1=repmat(b,3,1);这是将矩阵沿着某个方向进行复制。在将代码实现后可以看到效果的。若原来生成的b矩阵是 0.8622 0.3188 -1.3077,则b1的结果如下:
0.8622 0.3188 -1.3077
0.8622 0.3188 -1.3077
0.8622 0.3188 -1.3077
如果a和b的大小相同,那么c=a+b。但如果有某维不同,且a或b必须有一个在这一维的维数为1, 那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样。repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不会有使用matlab的for所带来额外时间。
测试程序:
clc;
clear all;%
tic;
I_g = imread('a.tif');%
a=I_g;
a=I_g(:,1);
I_t=imread('b.tif');%
b=I_t;
b=I_t(1,:);
[m n]=size(I_t);
tic
% for(i=1:m),
% for(j=1:n),
% c(i,j)=a(i)+b(j);
% end,
% end
% c;
% t0=toc
% tic
% c1=bsxfun(@plus,a,b);
% t1=toc
% tic
c2=repmat(a,1,n)+repmat(b,m,1);
t2=toc
其实根据结果还是有些不同的。使用bsxfun函数是最快的,for循环是次快的,最慢的是使用repmat来实现。从计算时间上来说前两种实现差不多,远高于repmat的实现。但如果数据很大时,不管是从时间还是从内存上来讲,选用bsxfun最好。本人对于大数据也实践过。
相关文章推荐
- 线性规划问题之MATLAB实现
- 在C#应用中使用Matlab函数
- MATLAB画图
- deep learning之PCA in 2D matlab 实现
- 二维最大类间方差(otsu)matlab实现源码
- Kinect桥接Matlab代码简介KinectBridge With Matlab
- matlab的log()函数默认是以e为底的
- matlab2012 toolbox 曲线拟合
- Matlab 画图函数
- Matlab install on ubuntu
- MATLAB 中的randn函数
- Matlab中size、numel、length、fix函数的使用
- Matlab plotyy画双纵坐标图实例
- 低版本MATLAB mex -setup找不到VS2013解决办法
- matlab中figure的坐标轴label、title、xticklabel的旋转
- matlab自带函数实现高斯滤波(gauss filter)快速算法
- Matlab从三维矩阵中取出一列并且reshape
- Matlab的rand(),randn()和randi()函数问题
- Matlab图像处理预处理
- Matlab图像处理:误拒率、误识率意义,计算等错误率的Matlab源码