2014-01-28 2 views
3

У меня тройной вложенный цикл в matlab, и для его решения требуется огромное количество времени. Есть ли у вас какие-либо рекомендации, как я могу ускорить симуляцию? Это конкретное моделирование выполняется быстро, но в реальном коде «t» имеет тысячи элементов, а A и B - около 400 элементов.Как ускорить эту тройную петлю в matlab

A = [1,2,3]; 
B = [1,2]; 
t=[1:1:4]; 
or hh = 1:length(t) 
    for ii = 1:length(A) 
     T1(ii,hh)=A(ii)*t(hh) 
      for jj = 1:length(B) 
       T2(ii,jj,hh)=A(ii)*B(jj)*t(hh) 
      end 
    end 
end 

T1_part=sum(T1); 
T2_part1=sum(sum(T2)); 
T2_part2=T2_part1(:,:); 
T_final=T1_part+T2_part2 

Результаты: T_final =

24 48 72 96 
+1

Просто чтобы быть ясно: я предполагаю, что реальный 'Ā',' b' и 't' не' [1 2 3 ..] '? –

+0

Насколько медленно это? Это займет около 0,5 секунды? Вы пробовали parfor вместо этого? –

+0

Проведенный код занимает 0.005s, но в моем реальном коде, когда я его покинул, прошло более 7 часов, а затем я остановил его. Нет действительных чисел для A, B и t с меньшими приращениями и разными. – user3200392

ответ

4

Попробуйте заменить петли с:

T1 = A'*t; 
T2 = bsxfun(@times, A'*B, permute(t,[3 1 2])); 

Причина перестановочны потому, что bsxfun расширит матрицу вдоль одноточечного измерения, так что вы необходимо убедиться, что ваша матрица расширяется по правильному размеру. Если вы дадите bsxfun вектор строки и матрицу, он попытается выполнить умножение по элементам вашего вектора строк и каждой строки вашей матрицы. Но мы хотим, чтобы умножить всю матрицу на каждый элемент вектора, но по новой ортогональной размерности. Таким образом, перестановка изменяет вектор от вектора строки на 3D-вектор, позволяя bsxfun расширяться вдоль правильного размера.

Но тогда и вы должны сначала попытаться просто pre-allocate memory для T1 и T2 использованием zeros, то есть до вашего цикла попробуйте T2 = zeros(size(A,2), size(B,2), size(t,2)). Вы всегда должны предубеждать, когда это возможно при использовании цикла.

+0

Может ли этот bsxfun использовать массивы gpu, чтобы сделать это быстрее? –

+0

@huseyintugrulbuyukisik Я считаю, что это должно быть, 'bsxfun', по-видимому, многопоточно с R2009a – Dan

+0

Предоставляет ли преалокация лучшее управление памятью для этих плотных умножений? –

0

как для T1 и T2 можно использовать поэлементное произведение двух векторов, что дает вам матрицу:

A = [1,2,3]; 
B = [1,2]; 

> T1=B'*A 

T1 = 

    1  2  3 
    2  4  6 
Смежные вопросы