Самый быстрый способ выполнить многократное поэлементное умножение матриц в MATLAB?

Учитывая матрицу 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 %! Но это по-прежнему самая трудоемкая линия. Есть еще предложения?

Используйте оператор матричного умножения: sum_temp = A.' * B;

rahnema1 19.02.2024 07:33

@rahnema1, это определенно помогло. Это действительно сократило время работы примерно на 33%! Можете ли вы написать это как ответ, чтобы я мог проголосовать за него?

RajaKrishnappa 19.02.2024 07:44

Я создал ответ.

rahnema1 19.02.2024 07:51

Видимо, мне нужна репутация, чтобы проголосовать за. Я приму ответ, как только в коде больше не будет улучшений. Спасибо.

RajaKrishnappa 19.02.2024 08:02

Дальнейших улучшений кода быть не может, если не указать, что такое func_temp(). Если вы можете создать матрицу для всех векторов A, то вы всё равно сможете это сделать A.' * B. Вы хотите, чтобы A была матрицей (>1 ​​миллиона)x9000, затем создайте матричное произведение A*B. Но такая большая матрица может замедлить ваш код больше, чем сам цикл.

Cris Luengo 19.02.2024 08:20
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
1
5
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте оператор матричного умножения:

sum_temp = A.' * B;

Другие вопросы по теме