Мой код требует ~ 0,003 с для запуска в Октаве и ~ 0,0007 в Matlab. Поскольку в Octave нет JIT-компиляции, я думаю, что Matlab выполняет закулисную оптимизацию, которую я должен делать сам.
numerators = zeros(1, 64);
for c = 1 : C
numerators(c) = py(c) * prod(diag(px{c}(:, x)));
end
py
- это 1xC
вектор строки. px
- это массив с C
элементами, каждый из которых представляет собой DxV
матрицу. x
- это вектор столбца Dx1
, значения которого дискретны в [1-V]
.
То, что prod(diag(...))
нечетность - это векторизованный способ умножения px{c}(d, x(d))
для всех d
:
p = 1;
for d = 1 : D
p *= px{c}(d, x(d))
endfor
cellfun
может работать, но я увяз в деталях передачи аргументов. (Если это можно сделать, просто скажи так, и я пойму, как себя). Другим вариантом может быть использование 3-D матрицы для px
, однако, я попробовал это, и мне достаточно новичка, что я ничего не смог заставить работать.