MATLAB:在脚本函数中缓慢读入常量变量
MATLAB: Slow Read-in of constant variables in Script Function
在最新的 MATLAB 版本中,我在脚本中使用局部函数的特性来简化和缩短代码。
现在我有一个简单的脚本可以进行数学计算,在 for
循环中迭代数百万次。从循环中,我提取了数学部分,因为它在多个独立循环中使用。但是,我遇到了函数中需要的速度和常量变量的问题。如果我写的代码没有本地函数,它很快,但是在使用函数的情况下,它慢了 10 倍。
我认为是函数中反复读入变量造成的。如果读入发生在文件中,则需要很长时间。我取得的最好成绩是使用 evalin
函数从基础工作区调用变量。它有效,但正如我提到的,它比没有单独的本地函数慢 10 倍。
如何克服这个问题?
结构如下所示:
load('Data.mat'); r=1; %Reads variables L,n
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x); r=r+1
end
end
%A few more different loops...
function y = myF(x)
L = evalin('base','L');
n = evalin('base','n');
...
a = (x-L)^2; b = sin(a)-n/2; ... y=b*a/L;
end
您需要将变量作为附加输入参数显式传递给 myF
,这样您就不必每次都加载它们。这样您就不必担心调用 evalin
或在循环的每次迭代中从文件中加载它们。
load('Data.mat'); r=1; %Reads variables L,n
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x, L, n); r=r+1
end
end
function y = myF(x, L, n)
a = (x-L)^2; b = sin(a)-n/2;
y=b*a/L;
end
如果由于某种原因你不能修改myF
,只要把整个东西变成一个函数,让myF
成为一个子函数,它就会因此自动访问父函数中的任何变量。在这种情况下,您还需要将 load
的输出分配给变量
function myfunction()
data = load('Data.mat');
L = data.L;
n = data.n;
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x);
r=r+1
end
end
function y = myF(x)
a = (x-L)^2; b = sin(a)-n/2;
y=b*a/L;
end
end
第三种选择是仔细研究 myF
并考虑是否可以将内容向量化,这样实际上就不必连续调用它数百万次。
你可以通过像
这样的方式来向量化它
[Lx, x] = ndgrid(L1:Ld:L2, x1:d:x2);
a = (x - L).^2;
b = sin(a) - (n / 2);
Yx = (b .* a) ./ L;
在最新的 MATLAB 版本中,我在脚本中使用局部函数的特性来简化和缩短代码。
现在我有一个简单的脚本可以进行数学计算,在 for
循环中迭代数百万次。从循环中,我提取了数学部分,因为它在多个独立循环中使用。但是,我遇到了函数中需要的速度和常量变量的问题。如果我写的代码没有本地函数,它很快,但是在使用函数的情况下,它慢了 10 倍。
我认为是函数中反复读入变量造成的。如果读入发生在文件中,则需要很长时间。我取得的最好成绩是使用 evalin
函数从基础工作区调用变量。它有效,但正如我提到的,它比没有单独的本地函数慢 10 倍。
如何克服这个问题?
结构如下所示:
load('Data.mat'); r=1; %Reads variables L,n
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x); r=r+1
end
end
%A few more different loops...
function y = myF(x)
L = evalin('base','L');
n = evalin('base','n');
...
a = (x-L)^2; b = sin(a)-n/2; ... y=b*a/L;
end
您需要将变量作为附加输入参数显式传递给 myF
,这样您就不必每次都加载它们。这样您就不必担心调用 evalin
或在循环的每次迭代中从文件中加载它们。
load('Data.mat'); r=1; %Reads variables L,n
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x, L, n); r=r+1
end
end
function y = myF(x, L, n)
a = (x-L)^2; b = sin(a)-n/2;
y=b*a/L;
end
如果由于某种原因你不能修改myF
,只要把整个东西变成一个函数,让myF
成为一个子函数,它就会因此自动访问父函数中的任何变量。在这种情况下,您还需要将 load
的输出分配给变量
function myfunction()
data = load('Data.mat');
L = data.L;
n = data.n;
for Lx = L1:Ld:L2
for x = x1:d:x2
Yx(r) = myF(x);
r=r+1
end
end
function y = myF(x)
a = (x-L)^2; b = sin(a)-n/2;
y=b*a/L;
end
end
第三种选择是仔细研究 myF
并考虑是否可以将内容向量化,这样实际上就不必连续调用它数百万次。
你可以通过像
这样的方式来向量化它[Lx, x] = ndgrid(L1:Ld:L2, x1:d:x2);
a = (x - L).^2;
b = sin(a) - (n / 2);
Yx = (b .* a) ./ L;