У меня есть два массива Matlab, A
B
, каждый размером 3085^2 x 4
. Мне нужно реализовать следующую процедуру:
Для каждой 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
.
Найдите общие 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,:)];
, но не хватает памяти.