【问题标题】:defining sym outside the function MATLAB在函数 MATLAB 之外定义 sym
【发布时间】:2015-01-29 00:12:30
【问题描述】:

我有一个 4 x 3 矩阵('mymatrix')。 myfunc 输入“mymatrix”并输出“result”。我在我的脚本中循环使用 myfunc(17280 次)。因此,每一次,它都会重新定义 syms x y z t。有没有办法在 myfunc 之外获取 'syms x y z t'。每次初始化需要 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:我也尝试过矢量化 for 循环,但未能成功。如果可以的话,我会很高兴的。

【问题讨论】:

  • 您说您正在调用此函数17280 次。由于这个函数的输入是mymatrix,我假设矩阵在某种循环中在这些迭代中发生变化。所以,这是我的问题 - 在开始 for iterations = 1:17280 的循环之前,您是否可以访问所有这些 17280 数据集?
  • 另外,是否可以将result 作为数字数组获取,还是绝对需要一个 sym 变量作为输出?
  • 什么是class(mymatrix)?是数字还是符号?
  • 'mymatrix' 是另一个函数的输出,在循环开始之前它是未知的。 'mymatrix' 是数字。

标签: matlab function symbolic-math


【解决方案1】:

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

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 在 cmets 中指出的那样,由于 results 是数字而非符号,因此可以通过切换到像 fsolvefzero 这样的数字求解器来获得巨大的性能提升(仅限 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 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2018-09-28
    相关资源
    最近更新 更多