我有一个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:我也尝试过矢量化循环,但无法成功。如果可以,我会很高兴。
答案 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倍。