在函数MATLAB之外定义sym

时间:2015-01-28 13:01:10

标签: matlab function symbolic-math

我有一个4乘3的矩阵(' mymatrix')。 myfunc输入' mymatrix'并输出结果'我在我的脚本中循环使用myfunc(17280次)。所以,每一次,它都重新定义了syms x y z t。有没有办法采取' syms x y z t'在myfunc之外。每次初始化需要0.004秒。

function result = myfunc(mymatrix)

tic
syms x y z t
toc

f = 3*x+5*y-6*z+7;
eqn = subs(f,{x,y,z},{mymatrix(:,1)*t,mymatrix(:,2)*t,mymatrix(:,3)*t});

for ii = 1:4
    result(ii,1) = solve(eq(ii))
end

PS:我也尝试过矢量化循环,但无法成功。如果可以,我会很高兴。

1 个答案:

答案 0 :(得分:2)

您可以在执行期间声明符号变量是持久的:

function result = myfunc(mymatrix)

    persistent x y z t
    if isempty(x)
        syms x y z t
    end
    ...
end

这导致我的机器执行时间减少约10%(从分析器0.65-ish到0.59-ish)。

然而,正如@Divakar在评论中指出的那样,由于results是数字而非符号,因此切换到fsolve或{{3}等数字求解器可以获得巨大的性能提升}(这里只发布fzero,因为它更快,是基本MATLAB套件的一部分):

function result = myfunc(mymatrix)

    A = mymatrix*[3;5;-6];
    f = @(t,k) A(k,:)*t + 7;

    N = size(A,1);
    result(N,1) = 0;
    for k = 1:N
        result(k) = fzero(@(t) f(t,k),0);
    end

end

在我的机器上,此功能运行0.02秒,比符号方法快30倍。

相关问题