与Mathematica相比,为什么MATLAB在这种情况下很慢

时间:2015-08-02 08:50:49

标签: performance matlab wolfram-mathematica symbolic-math

我在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的错吗?我希望尽可能缩短处理时间。

1 个答案:

答案 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是一个多项式,那么就有很多种可能性。

但是,如果我们知道您尝试实现的基础算法/方程式会更好,因为可能存在直接计算您想要的部分或全部内容的内置函数。