MATLAB: оптимизация кода

stream_24

Кто подскажет как оптимизировать время выполнения следующего блока в MATLAB:
 
a = zeros(1,N);
for j=2:N-1
a(j) = v(j,1) * u(j-1) + v(j,2) * u(j) + v(j,3) * u(j+1);
end

размеры массивов
v = zeros(N,3);
u = zeros(1,N);
Надо избавиться от цикла, т.к. этот участок кода вызывается много раз.
Спасибо!

Vlad128

К умножению матриц что-то не могу свести. Вот как минимум избавление от for:

a = v(2:end-1 ,1) .* u(1:end-2) +
v(2:end-1, 2) .* u(2:end-1) +
v(2:end-1, 3) .* u(3:end);
a = [ 0; a; 0 ];

Сейчас матлаба нет под рукой, должно еще сработать что-то типа

a = dot( v(2:end-1, [ u(1:end-2)' u(2:end-1)' u(3:end)' ] );
a = [ 0; a; 0 ];

либо надо все оттранспонировать, точно но помню.

stream_24

Спасибо, я пробовал и так, и так с определенным выигрышем по производительности.
Пока самое оптимальное решение следующее:
 


A = gallery('tridiag',v(:,1v(:,2v(:,3;
a(2:(N-1 = A(2:(N-11:(N-1 * u(1:(N-1;

Vlad128

да, ведь чувствовал, что задача-то из чего-то трехдиагонального, а матрицу восстановить не смог :crazy:
Мне кажется, больше выиграть не удастся. Если место действительно настолько критичное по производительности, то довольно разумно будет написать mex-файл. Почитай доки, это несложно. Можно написать участок кода на нормальном языке типа C/C++ или даже pascal.

stream_24

ОК, спасибо. Пока ограничусь данным вариантом.
Оставить комментарий
Имя или ник:
Комментарий: