如何提高matlab计算效率,总结一下几个原则:
1. 提前给数组分配大小。
例如:在程序循环时用到数组变量 a ,若知道数组 a 的大小或者知道 a 的大小上界,则可以提前给数组a 分配大小。一般MATLAB也会给没有提前
分配大小的变量数组下面标示红线,提醒修改。
a=zeros(10,10)生成一个10行10列的零矩阵。
a=100*ones(10,10)生成一个10行10列的矩阵,并且每个元素都是100。
a=(1:10)生成一个从1到10的1行10列矩阵。
2. 尽量用矢量计算,减少 for 循环。
最近我也才意识到这一点,matlab自带的很多函数都支持矢量计算。直接矢量计算,避免大量的for循环。
用 min 函数谨睁举例:
clc
a=(1:1000000)
tic
for i=1:1000000
a(i)=min(a(i),100)
end
toc
tic
b=max(a,100)
toc
结果显示:
时间已过 0.028604 秒。
时间已过 0.006296 秒。
可见后者比前者的团旦 for 循环快。
3. 尽量调用 maltab自带的函数来实现一些功能。
这个是显而易见的,matlab自带的函数由大神级的matlab开发人员所编写,他们当然会在计算速度上做不少优化,一定比我们编写的好。
4. 少用 find 函数,用 logical 替代。
查找替换矩阵中的塌晌扰元素,过去用 find 函数,现在用 logical 更好。
下面用一个例子,分别测试 for 循环,find函数,logical函数查找替换:
a=(1:10000000)
tic
for i=1:length(a)
if a(i)>5
a(i)=1
end
end
toc
tic
a(find(a)>5)=1
toc
tic
a(logical(a)>5)=1
toc
结果显示:
时间已过 0.407840 秒。
时间已过 0.378585 秒。
时间已过 0.119918 秒
可见,find 函数仅仅比 for 循环快一点,而 logical 函数则显著快于它们。
5. 大规模的循环,可以调用 c语言或 C++来 计算。
这个见不少资料说,自己还没试过,有机会测试一下。
如果CPU利用率低,而计算迟帆仔慢的话,说明你的程序处理的数据量并不大,但是处理流程很复杂,里面肯定涉及了很多的类似于for循环的语句,使得程序的时间复杂度一下子就上去了。看了下面你的补充回答,好像和多核处理并行计算没关系的。虽然最新版的matlab支持这种运行方式,但码汪感觉你似乎还用不到这么做。建议你还是优化轿厅一下你的算法。尽量减少for循环的次数,对于矩阵和向量运算,直接可以采用matlab现有的运算方法。X=[2,6,6,812,4,12,8]Y=[1,1,2,1]
n=size(X',1)
m=size(X,1)
s=size(Y,1)
A=[-X' Y']
b=zeros(n,1)
LB=zeros(m+s,1)
UB=[]%LB&UB分别是变量的下届和上届
for i=1:n
f=[zeros(1,m) -Y(:,i)']
Aeq=[X(:,i)'晌山旦 zeros(1,s)]
beq=1%Aeq是唯轿等式约束的系数矩阵
w(:,i)=linprog(f,A,b,Aeq,beq,LB,UB)%解线性规划,得DMU的最佳向量Wi
E(i,i)=Y(:,i)'*w(m+1:m+s,i)%求出DMU的相对效率值
end
w %输出最佳权向量
E %输出相对效率值Eii
omega=w(1:m,:) %输出投入权向量
mu=w(m+1:m+s) %输宴扰出产出权向量
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)