我已经制定了一个优化问题,需要对雅可比矩阵进行非常快速的评估。我使用MATLAB的符号工具箱从我的约束中分析地计算了雅可比。我需要一个分析雅可比行列式,以便它是准确的(我认为它会很快,但我目前的实现情况并非如此)。
这部分代码计算一次,结果J保存,然后加载到下一部分
% symbolic variables
dvs = 5;
X=sym('X',[dvs,1]);
% multiple functions
for k = 1:4
f1(X(k+1),X(k)) = (X(k+1) - X(k));
c(k) = f1;
end
J = jacobian(c,X);
x = ones(dvs,1);
以下是BOTTLENECK,在优化内部计算,每次加载J,x是设计变量的集合,X是变量的符号表达式。
方法1:
J_n = double(subs(J,X,x));
我也尝试过:
方法2:
J_fun(X) = jacobian(c,X);
然后我保存了J_fun
在优化期间,这样称为:
x = [1 3 4 5 10];
x=num2cell(x);
J_fun(x{:})
这也太慢了。
方法#3
http://www.mathworks.com/help/symbolic/create-matlab-functions-from-mupad-expressions.html
J_fun2 = matlabFunction(J_fun);
x = [1 3 4 5 10];
x=num2cell(x);
J_fun2(x)
时间:
方法1:经过的时间是0.038066秒。
方法2:经过的时间是0.017192秒。
方法3:经过的时间是0.000372秒。
评论/更新#1:这可能是显而易见的,但使用上述任何方法都要确保将雅可比行传递给函数而不是加载它。这是MUUUCCH更快!
对于这个问题它很快,但对于我的问题,它要慢得多(我有一个更大的问题)。
关于这个玩具问题,METHOD 3比其他两个快得多,但如果我能加快速度,我会很喜欢它。有什么想法吗?
评论/更新#2:
方法4
归功于霍克勒。
这似乎是一个新网站,因为我在研究这个问题时没有注意到它: http://www.mathworks.com/help/optim/ug/symbolic-math-toolbox-calculates-gradients-and-hessians.html
filename = 'func.m';
matlabFunction(J_fun,'file',filename,'vars',{X});
x = [1 3 4 5 10];
x=num2cell(x);
pause
tic
func(x')
toc
非常类似于METHOD 3,除了您正在构建和优化您可以查看的实际函数。性能方面它类似于METHOD 3(对于简单的例子),我目前正在为我的问题运行此代码,它可能永远不会完成,方法3花了大约10分钟来制作计算约束的.mat文件,方法4运行5小时。现在我必须计算一个雅可比人和大约1000个Hessians .....我正在考虑建立一个集群来做这个,但我不确定它会完成。
MY ACTUAL CONSTRAINT评估时间比较:
方法3:经过的时间是1.252072秒。
方法4:经过的时间是0.716127秒。
因此,METHOD 4肯定更快。
答案 0 :(得分:0)
方法#3 使用此处描述的方法,它以可接受的速度运行!
http://www.mathworks.com/help/symbolic/create-matlab-functions-from-mupad-expressions.html
J_fun2 = matlabFunction(J_fun);
x = [1 3 4 5 10];
x=num2cell(x);
J_fun2(x)