Символьные производные: почему мой R-код намного быстрее, чем мой MATLAB-код?

#r #matlab #symbolic-math

#r #matlab #символьный-математический

Вопрос:

Я закодировал в R и MATLAB символьную производную простой функции и вычислил значение производной в x = 4 . Я повторяю операцию 1000 раз (потому что это то, что мне понадобится позже).

MATLAB-код

 tic
for i=1:1000

syms nu;

t=100;
gam=3;
x=4;

myfunction = (-gam * nu)   0.5 * t * nu *log(nu/2)-t*log(gamma(nu/2));

out = double(subs(diff(myfunction),nu,x));
end
toc
  

R-код

 ptm <- proc.time()

for (i in 1:1000) {

t<-100
gam<-3
x<-4

myfunction <- deriv(~(-gam * nu)   0.5 * t * nu * log(nu/2) - t * 
                  log(gamma(nu/2)), c("nu"), function(nu) {
                  }, hessian = TRUE)

aux1 <- myfunction(x)

out <- attr(aux1, "gradient")[1]

}

proc.time() - ptm
  

При сравнении скорости выполнения моего R-кода и MATLAB-кодов R намного быстрее, чем MATLAB.

Код MATLAB: 28 секунд; R-код: 0,18 секунды.

Как это возможно? Я что-то пропустил?

Комментарии:

1. Может быть несколько причин, лежащих в основе структуры (ов) функций. Они точно такие же? Вычислительная (процессорная мощность) может привести к разным результатам для разных пользователей. Следовательно, можно также утверждать, что MATLAB быстрее, чем R на их компьютере или ОС (хотя и не уверен).

2. Я никогда не использовал R для символьных операций, поэтому понятия не имею, насколько это быстро. Конечно, MATLAB не быстр для символьной математики. Программное обеспечение MATrix LABoratory быстро работает с матричной и числовой математикой.

3. Я не знаю, что там делает Matlab, но stats:::deriv.formula он практически полностью реализован в C-коде. Вы (и я) также не проверяли тайминги без JIT-компилятора.

4. Это символьный пакет в Matlab, а не сам Matlab, тогда как вы используете базовый R, поэтому неясно, является ли это справедливым сравнением.

5. Ваш пример Matlab не особенно хорош. Переменная цикла на самом деле не используется. Он не использует преимущества какой-либо векторизации. Переменные излишне повторно объявляются на каждой итерации цикла (например, syms nu; ), что особенно дорого для символьных переменных. Возможно, можно было бы провести некоторую оптимизацию, но трудно сказать, не глядя на реальный случай.