Учитывая матрицу A
, мне нужно умножить ее на другой постоянный вектор B
N раз (N > 1 миллион). Размер A
равен 9000x1
, а B
равен 9000x1000
.
В настоящее время код оценивается следующим образом:
for i=1:N
A = func_temp(i); % A is 9000x1 matrix which varies with i
%prod = A.*B; % prod is 9000 x 1000 matrix
%sum_temp = sum(product); % sum_temp is 1 x 1000 matrix
% Edit: suggestion by user @rahnema1
sum_temp = A.' * B;
% do multiple pperations with sum_temp
result(i) = some_constant;
end
Я использовал Profiler, чтобы увидеть, какая строка занимает больше всего времени, и это вторая строка (prod = A.*R;). Проблема в том, что N очень велико, и выполнение кода занимает несколько дней.
Я собираюсь попробовать набор инструментов для параллельных вычислений (вычисления на графическом процессоре), но есть ли какие-нибудь предложения о том, что я могу делать в базовой версии?
Как я могу сократить время выполнения таких кодов в MATLAB?
Обновлено: я добавил в код правку, предложенную в комментариях, которая сократила время выполнения на 33 %! Но это по-прежнему самая трудоемкая линия. Есть еще предложения?
@rahnema1, это определенно помогло. Это действительно сократило время работы примерно на 33%! Можете ли вы написать это как ответ, чтобы я мог проголосовать за него?
Я создал ответ.
Видимо, мне нужна репутация, чтобы проголосовать за. Я приму ответ, как только в коде больше не будет улучшений. Спасибо.
Дальнейших улучшений кода быть не может, если не указать, что такое func_temp()
. Если вы можете создать матрицу для всех векторов A
, то вы всё равно сможете это сделать A.' * B
. Вы хотите, чтобы A
была матрицей (>1 миллиона)x9000, затем создайте матричное произведение A*B
. Но такая большая матрица может замедлить ваш код больше, чем сам цикл.
Используйте оператор матричного умножения:
sum_temp = A.' * B;
Используйте оператор матричного умножения:
sum_temp = A.' * B;