相关文章推荐
睿智的楼房  ·  RxJava ...·  1 年前    · 
精明的荔枝  ·  BottomNavigationView-- ...·  1 年前    · 

由于本人在学习中无意中遇到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最好。本人对于大数据也实践过。

由于本人在学习中无意中遇到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 array 实例1:矩阵A的每列元素减去该列的平均值。 一般做法,先求A的平均值,得到的结果是1*3的矩阵(按列求平均值),然后将得到的结果进行扩充,即将一行复制成三行使得维度和A保持一致,最后做减法运算。 A = [1 2 10; 1 4 20; ...
错误信息:错误使用 bsxfun ,不支持混合的整数类输入。出错 gradient,g(2:n-1,:) = bsxfun (@rdivide,(f(3:n,:)-f(1:n-2,:)),h)。 问题解决:把数据类型转换成double可以解决:[Fx,Fy]=gradient(double(gray)); fileName='grass5.png'; img=imread(fileName); gray=rgb2gray(img); [Fx,Fy]=gradient(double(gray));
bsxfun (fun,A,B) 偶然间发现了这个 函数 ,强大得不得了呀,它的作用是:对两个矩阵A和B之间的每一个元素进行指定的计算( 函数 fun指定);并且具有自动扩维的作用 例如,A是一个4*3的矩阵,B是一个4*1的列向量,如果想要矩阵A的每一列都对向量B进行一些操作,比如,A的每一列的相应元素都要除以向量B 的相应元素,那么,比较原始的方法就是利用repmat命令,将向量B进行平铺,对它的每...
### 回答1: bsxfun 函数 Matlab 的一个 函数 ,用于对两个数组进行二元操作。它的作用是将两个数组进行广播,使它们的维度相同,然后再进行二元操作。这个 函数 的语法格式为: C = bsxfun (fun,A,B) 其 ,fun是一个 函数 句柄,用于指定二元操作的 函数 ;A和B是两个数组,可以是向量、矩阵或多维数组。 函数 的返回值C是一个与A和B维度相同的数组,其 每个元素都是对应位置上A和B的元素进行fun操作的结果。 bsxfun 函数 的优点是可以避免使用循环,提高代码的运行效率。它常用于矩阵运算、图像处理等领域。 ### 回答2: bsxfun MATLAB 一种非常有用的 函数 ,它的全称为Binary Singleton Expansion Function。 BSXFUN 函数 主要用于两个数组之间的处理,它能够将两个数组进行大小转换和广播,然后再进行相应的运算。 BSXFUN 函数 可以对两个维度不同的数组进行运算,功能强大,可以大大提高数组运算的效率。 BSXFUN 函数 的用法与 MATLAB 的矩阵运算非常类似,它可以是用运算符(+,-,*,/)来进行数组的运算。在进行运算时, BSXFUN 函数 将对输入数组进行广播操作,将输入数组扩展至相同的维数,然后进行相应的运算。这样就非常方便,可以省去了输入数组大小一致的繁琐操作。 需要注意的是, BSXFUN 函数 可以广播数组到任意大小,这样可能会影响运算的性能。因此,在使用 BSXFUN 函数 时,我们应该尽量避免使用过多的广播,以免影响程序的运行效率。 另外,需要注意的是, BSXFUN 函数 不能用于所有的运算,它只能用于一些特定的运算,例如加法和减法。对于其他类型的运算,我们需要使用其他的 函数 来实现。 总之, BSXFUN 函数 MATLAB 一种非常有用的 函数 ,它可以大大提高数组的运算效率,减少了输入数组大小一致的繁琐操作。在使用 BSXFUN 函数 时,我们需要注意广播数组的大小,以免影响程序的运行效率。 ### 回答3: bsxfun 函数 是一个在 Matlab 非常有用的 函数 ,可以帮助用户对多维数组进行各种运算。 bsxfun 的全称是Binary Singleton Expansion Function,它的作用是处理两个输入矩阵,使得它们具有相同的大小,以便能够进行各种运算。 bsxfun 函数 的语法格式如下: C = bsxfun (fun,A,B) 其 ,fun是指封装 函数 的句柄,A和B是输入的矩阵,C是结果矩阵。 bsxfun 函数 的作用是将矩阵A与矩阵B进行运算,如相加、相减、相乘等。如果A和B的维数不同, bsxfun 函数 会自动将较小的矩阵在某一个维度上进行扩展,使它们具有相同的大小。例如,将一个1×3向量加上一个3×1向量,可以使用 bsxfun 函数 实现: a = [1 2 3]; b = [4; 5; 6]; c = bsxfun (@plus,a,b); 运行结果为: c = [5 6 7; 6 7 8; 7 8 9]; bsxfun 函数 还可以扩展到更多的维度,比如三维、四维甚至更高维度的数组。同时, bsxfun 函数 还可以结合匿名 函数 进行操作,比如: a = [1 2; 3 4]; b = [5 6; 7 8]; c = bsxfun (@(x,y) x.^y,a,b); 运行结果为: c = [1 64; 2187 65536]; 以上就是 bsxfun 函数 的一些基础用法。总之, bsxfun 函数 是一个非常强大的 Matlab 函数 ,可以大大简化矩阵运算的编写过程,同时也应用非常广泛。