Повышение скорости кода Matlab для суммирования двух больших массивов - PullRequest
1 голос
/ 07 августа 2020

У меня есть два массива Matlab, A B, каждый размером 3085^2 x 4. Мне нужно реализовать следующую процедуру:

  1. Для каждой h -й строки из A, A(h,:) вычислить A(h,1)+B(:,1)+A(h,2)+B(:,2)-(A(h,3)+B(:,3))-(A(h,4)+B(:,4)) и сохранить min и max полученного вектора 3085^2x1.

  2. Найдите общие min и max по min и max, найденные на предыдущем шаге.

Вот как я реализовал процедуру.

   clear
    rng default
    sm=3085^2;
    A=randn(sm,4);
    B=randn(sm,4);
    
    
    D_interval_temp=zeros(sm,2);
    for h=1:sm
        tic
        D_temp=A(h,1)+B(:,1)+A(h,2)+B(:,2)-(A(h,3)+B(:,3))-(A(h,4)+B(:,4)); 
        D_interval_temp(h,:)=[min(D_temp) max(D_temp)];
        toc
    end
    
    D_interval=[min(D_interval_temp(:,1)); max(D_interval_temp(:,2))];

Проблема в том, что мой алгоритм очень медленный: каждая итерация l oop занимает 0,12 se c. Следовательно, выполнение кода займет около 317 часов.

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

Я пытался векторизовать как

ndgrid(1:sm, 1:sm);
cx1=cx1(:);
cx2=cx2(:);
AB=[A(cx1,:) B(cx2,:)];

, но не хватает памяти.

1 Ответ

3 голосов
/ 07 августа 2020

Вы можете получить желаемый результат, используя это:

BB = B(:, 1) + B(:,2) - B(:,3) - B(:,4);
AA = A(:, 1) + A(:,2) - A(:,3) - A(:,4); 
D_interval = [min(BB) max(BB)] + [min(AA) max(AA)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...