matlab中50x50的矩阵怎么提高计算速度

matlab中50x50的矩阵怎么提高计算速度,第1张

如下。

如何提高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) %输宴扰出产出权向量


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12386091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存