более быстрый способ добавить много больших матриц в Matlab - PullRequest
0 голосов
/ 08 мая 2018

Скажем, у меня много (около 1000) больших матриц (около 1000 на 1000), и я хочу сложить их поэлементно. Очень наивный способ - использовать временную переменную, которая накапливается в цикле. Например,

summ=0;
for ii=1:20
    for jj=1:20
    summ=summ+ rand(400);
    end
end

После поиска в Интернете, кто-то сказал, что лучше сделать с помощью sum (). Например,

sump=zeros(400,400,400);
count=0;
for ii=1:20
    for j=1:20
        count=count+1;
        sump(:,:,count)=rand(400);
    end
end
sum(sump,3);

Однако, после того, как я проверил два способа, результат

Elapsed time is 0.780819 seconds.
Elapsed time is 1.085279 seconds.

, что означает, что второй метод еще хуже.

Так что мне просто интересно, есть ли эффективный способ сделать сложение? Предположим, что я работаю на компьютере с очень большой памятью и GTX 1080 (CUDA может быть полезным, но я не знаю, стоит ли это делать, поскольку общение также требует времени.)

Спасибо за ваше время! Любой ответ будет высоко оценен!.

1 Ответ

0 голосов
/ 10 мая 2018

Самый быстрый способ - вообще не использовать циклы в matlab. Во многих случаях внутренние функции matlab все хорошо оптимизированы для использования SIMD или других методов ускорения. Пример использования встроенных функций для создания матриц нужного размера: X = rand(sz1,...,szN). В вашем явном случае sum(rand(400,400,400),3) должен дать вам самый быстрый результат.

...