Matlab------------提高运算速度

1.提前初始化矩阵

clc 
clear 
close all

a=2;
b=2.9;

x=zeros(250000,1);
x(1)=0.1;


for n=1:250000
  x(n+1)=abs( (x(n))/a^2-x(n)*b );
end

plot(x,'k','markersize',10);
xlabel('n');
ylabel('x(n)');

加了x=zeros(250000,1);后运算为1s之内,不加运算长达10s以上

原理:

matlab不像其他语言那样,对变量采用“先定义,后使用”的规则,但是,我的经验是,在使用一个变量之前,最好先对它进行“定义”,这里的“定义”是指为它分配空间,这样不但可以提高运行的速度,而且还可以减少出错的几率,特别是在循环赋值、且变量大小不固定的时候。

2.把三维矩阵Mask变成一维矩阵C:
B = reshape(A, 61*73*61, 210);
C =

t =

【方案1】
iTotalVoxel = 61*73*61;
for k = if C(k) == 1
    temp =
    imf = emd(t, temp);
    …
  end
end
【方案2】
D = find(C);
iTotalBrainVoxel = length(D);
for k = temp =
  imf = emd(t, temp);
  …
end

【方案1】明显是基于C语言的套路,而【方案2】则充分避免了matlab的弱点――循环,经过改进以后(“多维转一维”为此提供了保证,多维的话,恐怕要使用形如A(X(k),Y(k),Z(k),:)的形式了),由于循环次数的降低(大约降低为原来的1/3),故运行时间大致上减少了一半。

由此可见,在matlab中,想加快运行速度,不但要减少循环的层数,而且,还要减少循环的次数。

以下是对【例2】(实现大脑激活区检测)的不同实现的结果比较:(核心工作是对73000个前景点相应的时间序列进行EMD处理,生成10个左右的imf,其中抽取每个imf时平均迭代大概10次左右)

版本1:完全用matlab编写——运行时间大约是200分钟,也就是说,要在matlab做73000*100次循环,最头痛的是迭代时的需要产生样条包络,默认的spline函数耗时相当多;

版本2:用matcom转换成cpp文件后在Borland C++ Builder中运行,完全脱离matlab——由于spline函数耗时太多,因此转换前改用了折线包络,而非样条包络,运行时间为15分钟左右,不过这个结果是对仿真数据,非实际数据而言的,因为我仍未解决matrix.h和matlib.h不能共存的问题,故无法对实际数据进行测试,不过一般来说实际数据比仿真数据运行速度更慢;

版本3:把核心代码(基于样条包络的EMD算法)做成dll文件后在matlab中调用——整个程序,从数据输入到数据输出,只在一个地方使用了一层for循环(就是【例2】中【方案2】的循环),且结合上述优化方案,对于实际数据大概5分钟就能得出结果。

你可能感兴趣的:(c,算法,matlab,dll,语言,Borland)