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;