为什么MATLAB在这种情况下比Mathematica慢



我在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的问题?我想尽量缩短处理时间。

试图写出"等效"的代码总是充满了危险。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是一个多项式,则有许多可能性

然而,如果我们知道你想要实现的底层算法/方程是什么,那就更好了,因为可能有内置函数直接计算你想要的部分或全部东西。

相关内容