我在Mathematica中有这个代码:
n = 5;
k1[x_, t_] := t^2;
k[m_, n_] := (1/(m!*n!)*D[k1[x, t], {t, n}, {x, m}]) /. {x -> 0, t -> 0};
kmn = Table[k[i, j], {i, 0, n}, {j, 0, n}];
kmn // MatrixForm
以 0.03 秒执行。
以下是我在MATLAB中结束的等效代码:
syms t x;
n=5;
k1 = @(x,t) t^2;
kmn=zeros(n+1);
for i=0:n
for j=0:n
dift=subs(diff(k1,t,j),t,0);
kmn(i+1,j+1)=(1/(factorial(j)*factorial(i)))*subs(diff(dift,x,i),x,0);
end
end
kmn
但它在 4.970502 秒内执行。
我的MATLAB代码出了什么问题?或者,这是MATLAB的错吗?我希望尽可能缩短处理时间。
答案 0 :(得分:1)
试图提出"相当于"代码总是充满危险。 Mathematica和Matlab的符号数学在哲学和实现上有很大不同。
对于您提出的Matlab代码,您要尝试做的第一件事是删除双for
循环。然后尝试向量化和操作并重用以前的结果。如果可能,只要您知道结果是精确的(例如,factorial
表示小整数),就可以用数字方式进行计算,而不是象征性地进行计算。这是尝试做这些事情的一部分:
syms t x;
n = 5;
k1 = @(x,t) t^2;
kmn = zeros(n+1);
j = 0:n;
dift = zeros(1,n+1,'sym');
for i = j
dift(i+1) = subs(diff(k1,t,i),t,0);
end
fj = factorial(j);
for i = j
kmn(i+1,:) = subs(diff(dift,x,i),x,0)./(fj.*fj(i+1));
end
kmn
在k1
不是x
的函数的情况下,可以进一步优化代码以消除不必要的区分和替换。如果k1
是一个多项式,那么就有很多种可能性。
但是,如果我们知道您尝试实现的基础算法/方程式会更好,因为可能存在直接计算您想要的部分或全部内容的内置函数。