在使用matlab进行矩阵计算的时候,经常会遇到要使用for循环的情况。但其实很多操作可以用内部的一些函数代替。 bsxfun, arrayfun, cellfun, spfun, structfun

bsxfun:

1
C = bsxfun(fun,A,B)

bsxfun可以对矩阵A和矩阵B进行对应元素的fun函数操作。其中,fun是任何标量输入输出的二元操作的函数,例如基本的加减乘除,三角函数,大小比较,以及其他任何符合条件的自定义函数。

注意,fun不能是符号,例如+,*之类,这些符号都有对应的函数名。例如+ 对应 plus, >= 对应 ge,等等。可以通过matlab命令行输入

help <运算符号>

来查询。

一般来说,如果两个矩阵一样大,我们可以直接通过 A+B 这样的方式一样实现,但是bsxfun有一个优点,就是当A,B中任何一维长度为1的时候,函数会自动将该维度和另一个矩阵对应维度的每一行(列)进行运算。如果我们自己进行这样的操作,我们或者要使用循环,或者要使用repmat来扩展矩阵,这都比bsxfun在底层内部实现慢很多,或者要消耗更多内存。

网友提供了这样一个例子:假设我们有数据A和B, 每行是一个样本,每列是一个特征。我们要计算高斯核,既:

k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。

当然可以用双重for实现:

1
2
3
4
5
6
K1 = zeros(size(A,1),size(B,1));
for i = 1 : size(A,1)
for j = 1 : size(B,1)
K1(i,j) = exp(-sum((A(i,:)-B(j,:)).^2)/beta);
end
end

使用2,000×1,000大小的A和B, 运行时间为88秒。

考虑下面向量化后的版本:

1
2
3
sA = (sum(A.^2, 2));
sB = (sum(B.^2, 2));
K2 = exp(bsxfun(@minus,bsxfun(@minus,2*A*B', sA), sB')/beta);

使用同样数据,运行时间仅0.85秒,加速超过100倍。

arrayfun:

1
2
[B1,...,Bm] = arrayfun(func,A1,...,An)
[B1,...,Bm] = arrayfun(func,A1,...,An,Name,Value)

这个函数可以直接对数组中的元素进行func函数操作。其中,func函数接受n个输入,m个输出。当输出可以进行合并的时候,可以设置 'UniformOutput' 为true,这样所有 A1..An经过func的第m个输出就会合并为一个数组 Bm,如果'UniformOutput'为false,表示不同输入元素对应的输出不能合并,这样每个Bm就会是一个cell。

matlab的帮助里有个很好的例子,这里就不贴上来了。

cellfun:

1
2
[A1,...,Am] = cellfun(func,C1,...,Cn)
[A1,...,Am] = cellfun(func,C1,...,Cn,Name,Value)

和arrayfun的用法类似,不过是对cell的对应元素进行操作。

structfun:

1
2
[A1,...,An] = structfun(func,S)
[A1,...,An] = structfun(func,S,Name,Value)

类似的用法,对结构体S的所有域进行func操作。

spfun:

1
f = spfun(fun,S)

这个函数可以对一个稀疏矩阵S的每个有值的元素进行fun操作。

这个函数的用途不仅仅是可以提升速度,更重要的是能够保持返回的f中,没有数据的地方依然为0. 例如:

1
2
S = spdiags([1:4]',0,4,4)
f = spfun(@exp,S)

S =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
f =
(1,1) 2.7183
(2,2) 7.3891
(3,3) 20.0855
(4,4) 54.5982
而直接运行

1
exp(S)

的话,没有数据的地方都变成1了。

1
full(exp(S))

ans =
2.7183 1.0000 1.0000 1.0000
1.0000 7.3891 1.0000 1.0000
1.0000 1.0000 20.0855 1.0000
1.0000 1.0000 1.0000 54.5982

Matlab中用内建函数代替for循环的更多相关文章

  1. C#中用radio单选Repeater循环数据,js实现

    <asp:Repeater ID="rpt" runat="server"> <ItemTemplate> <tr data-id ...

  2. Application_Start事件中用Timer做一个循环任务

    protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new Syste ...

  3. matlab循环中显示figure时窗口跳动

    在Matlab中,当在一个循环内部利用figure显示图片时,有时候会出现窗口跳动,尤其是两个显示器的时候, 具体就是每次循环中显示的figure的位置都出现在屏幕的不同位置,导致看起来灰常不爽 go ...

  4. 如何加速MATLAB代码运行

    学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...

  5. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)

    利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...

  6. Matlab图像函数之pie

    一.pie pie用于描绘平面饼图. (1)pie(X) 利用向量X中的数据描绘饼图. 例如: X = [1, 1, 2, 2, 3, 4, 5]; pie(X) 得到 注意,X中的数据被看做频数,饼 ...

  7. Matlab使用技巧

    (1) Matlab强制退出正在运行的程序A: Ctrl + C(2)如何让Matlab跑完程序后自动关机?A: 在程序的末尾加上一条代码:    system('shutdown -s')   当然 ...

  8. Matlab中TCP通讯-实现外部程序提供优化目标函数解

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Matlab中TCP通讯-实现外部程序提供优化目标函数解     本文地址:http://te ...

  9. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

随机推荐

  1. GitHub上搭建Hexo化的博客

    遇过的坑: 使用GitBash安装Hexo(npm的环境变量配置)注意 安装完成后添加Path环境变量,使npm命令生效.新版已经会自动配置Path 1 ;C:\Program Files\nodej ...

  2. A fatal error has been detected by the Java Runtime Environment:

    在Eclipse中运行项目 遇到如下错误: ## A fatal error has been detected by the Java Runtime Environment:## EXCEPTIO ...

  3. hdu 2604 Queuing(矩阵快速幂乘法)

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  4. excel中匹配数据

    =VLOOKUP(E6,BC:BD,2,0) E6就是要对应的那一列的一个单元格,BC就是对应的那一列,BD就是要取值的那一列

  5. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行

    错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...

  6. OC中最难的一部分内容:内存管理

    OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...

  7. RemoveAll 要重写equals方法

    public class User { private String name; private int age; //setter and getter public String getName( ...

  8. Programming C#.Classes and Objects.传递参数

    ref 关键字通过引用(而非值)传递参数. 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中. 说明: 不要混淆通过引用传递的概念与引用类型的概念. 这两种概念是不同的. 无 ...

  9. statistics specify some columns count

    # -k1 follow the first column nr

  10. leetcode Binary Tree Level Order Traversal python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...