Writing Fast Matlab code 6-7

本文介绍了如何通过内联简单函数和优化引用操作来提高MATLAB代码的运行速度。讨论了内联函数如conv、cross、fft2等的好处,并强调了向下扫描列的缓存效率优势。还详细讲解了下标与索引的区别、向量化下标、索引向量、通配符和逻辑索引的使用。此外,文章提到了解线性方程的技巧,包括pinv函数和迭代方法如bicg和gmres。
摘要由CSDN通过智能技术生成

6 内联简单函数

“内联一个函数”指用一个调用取代函数代码本身。注意你定义的M函数不要与MATLAB本身自带的函数混淆。如果你需要修改函数,在操作台键入:

edit [函数名]

以下函数值得内联:
conv:卷积
cross:叉乘
fft2:二维快速傅里叶变换
fliplr:将左边列交换到右边
flipud:将上边行交换到下边
ifft / ifft2 / ifftn
ind2sub:得到线性索引的下标
setdiff:集合差集
setxor:集合异或(不在交集中的元素)
unique:去除重复行列

7 引用操作

7.1 下标 vs. 索引
Matlab中存矩阵数据的时候是按一维数组重点内容存储的,故索引指的是元素在这个一维数组中的位置;而用下标能直接指到元素在矩阵中所在的位置。

向下扫描列比行更快!!
向下扫描列能提高缓存效率。

下标与索引间的转换可以用 sub2ind 函数 和 ind2sub 函数。

当然直接计算比调用M函数更快。下面给出转换规则:
这里写图片描述

7.2 向量化下标
利用下标比直接调用元素本身更好。例如,如果A是一个二维矩阵,那它的向量化下标:
A(rowv, colv)

此处rowv和colv都是向量,且长度任意。如果其中有一个是矩阵,会被Reshape成一个向量。在这里用行向量或者列向量都是没差别的。

7.3 索引向量
索引向量可以引用多个元素:
A(indexv)

7.4 通配符
利用通配符“ :”可以指代整列或整行。

7.5 逻辑索引
一个常见用法是基于针对每个元素的条件,例如:

A(abs(A) < 1e-3) = 0

就将所有小于10.^-3的元素置为0

逻辑索引也可以用于选择非方阵的元素:

A(logical(eye(size(A))))

注意!这个比用diag(A)去引用了A对角元素快多了!!!

7.6 利用[]删除子矩阵
A(2,:) = [];

8 解线性方程Ax = b

一般来说x = A \ b,但若A奇异

x = pinv(A) * b(求近似解)

8.1 迭代方法
matlab中有很多迭代解决方法:

[bicg]双共轭梯度法求解线性方程组
共轭梯度算法是一种迭代方法,它从一组初值向量出发,定义代价函数,进而转化为最优化问题。
它是寻找一个向量,这个向量使得计算的代价函数为极值,这里为最小值。

clear;clc%利用是双共轭梯度算法求解线性方程组
A=[23.6 -6.8 4.5 6.3 7.2 8.6
    4.2 7.62 0.8 -3.1 -4.5 5.3
    9.8 -6.8 45.2 3.07 -4.37 7.82;
    8.4 -9.05 24.4 2.65 6.53 -3.64;
    -9.5 4.54 15.8 4.89 4.8 -7.48;
    26.32 3.08 4.6 -3.5 -7.8 25.6];
b=[-9.50 8.12 42.30 -21.40 4.70 3.47]';
[x,flag,relres,iter,resverc]=bicg(A,b,1e-11)

[gmres]广义最小残差法求解线性方程组

当迭代值x所引起的相对残差小于或等于给定的收敛值时,停止迭代。

clear;clc%利用gmres函数求解线性方程组
A=[25.4 -6.5 5.5 6.3 6.2 4.6
    4.5 7.62 0.7 -3.1 -4.5 5.1
    8.9 -6.8 5.2 3.07 -4.37 7.8
    8.4 -5.05 4.4 2.65 6.53 -4.4
    -9.5 4.54 6.3 4.89 4.8 -7.4
    6.3 4.08 1.6 -3.5 -7.8 5.6];
b=[-4.5 7.2 4.3 -2.4 24.7 5.7]';
[x,flag,relres,iter,resvec]=gmres(A,b)

还有很多很多的方法但语法都差不多,具体情况下用哪个参照下图:
这里写图片描述

除了可以将它存成矩阵形式,更为便捷的方法是将A表示为一个线性方程。比如
这里写图片描述
可表达为A * x = cumsum(x)\

另,有些特殊矩阵可以很快算出:
1.循环行列式矩阵;在傅里叶域中可对角化,x = ifft(fft(b) ./ fft(h))
2.三角阵和带状矩阵:可用LU分解:[L, U] = lu(sparse(A)); x = U\ (L\b);
3.泊松问题。可查找matlan multigrid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值