如果我有一首颂歌,是用两种方式写的,比如这里:
function re=rabdab()
x=linspace(0,2000,2000)';
tic;
[T,Y] = ode45(@fun,[x],[0 1 1]);
[T,Y] = ode45(@fun,[x],[0 1 1]);
[T,Y] = ode45(@fun,[x],[0 1 1]);
toc;
tic;
[A,B] = ode45(@fun2,[x],[0 1 1]);
[A,B] = ode45(@fun2,[x],[0 1 1]);
[A,B] = ode45(@fun2,[x],[0 1 1]);
toc;
function dy = fun(t,y)
dy = zeros(3,1); % a column vector
dy = [y(2) * y(3);...
-y(1) * y(3);...
-0.51 * y(1) * y(2);];
function dy = fun2(t,y)
dy = zeros(3,1); % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
时间上几乎没有差别一个和另一个一样长但我认为
fun
是fun2
的矢量化版本还是我搞错了?目的是加快我的代码速度示例取自matlab网页。
我想我还没有真正理解“矢量化”是什么意思。
如果这已经矢量化了,那么非矢量化的代码会是什么样子?
最佳答案
Vectorization是一个与functional programming密切相关的概念在MATLAB中,它意味着对数组(向量或矩阵)执行操作而不隐式地编写循环。
例如,如果要为1到100之间的每个整数计算函数f(x) = 2x
,可以编写:
for x = 1:100
f(x) = 2 * x;
end
不是矢量化的代码矢量化版本为:
x = 1:100; %// Declare a vector of integer values from 1 to 100
f = 2 * x; %// Vectorized operation "*"
或者更短:
f = 2 * (1:100);
MATLAB是一种解释语言,所以很明显,解释器将其转换为某种“隐藏”的循环,但是它是优化的,通常比实际解释循环快得多(阅读this question以供参考)嗯,有点——直到最近的MATLAB版本,它集成了JIT acceleration(readhere)。
现在回到您的代码:这里有两个矢量化版本的代码:一个垂直连接三个值,另一个直接将这些值赋给列向量基本上是一样的如果您使用显式for循环完成此操作,则不会对其进行“矢量化”关于“矢量化”循环的实际性能增益(即,将for循环转换为矢量化操作),这取决于for循环最初由于JIT加速而实际产生的速度。
似乎没有太多事情要做来加速你的代码您的函数非常基本,因此它可以归结为
x
的内部实现,您不能修改它。如果您对进一步阅读矢量化和编写更快的MATLAB代码感兴趣,这里有一篇有趣的文章:Loren on the Art of MATLAB: "Speeding Up MATLAB Applications"。
快乐编码!
关于matlab - 在Octave/Matlab中矢量化ODE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16762428/