2013-10-07 3 views
0

Я пытаюсь запустить этот кусок кода в matlab, но он имеет высокую сложность , несмотря на то, что matlab очень медленный с циклами. Может немного помочь мне оптимизировать код ниже.Сокращение времени на сложность кода matlab

for k=1:th 
    for i=1:D-1 
     for j=i+1:D 
      if(dist(j,k)>dist(i,k)) 
       t=ClassP1(k,i); 
       ClassP1(k,i)=ClassP1(k,j); 
       ClassP1(k,j)=t; 
      end 
     end 
    end 
end 

где

размер (ClassP1) = 20x4276

размер (расстояние) = 4276x20

Спасибо большое заранее

Rinadi

+2

Новые версии Matlab не медленны в циклах. Есть ли какая-то реальная проблема с временем, или просто вы хотите улучшить решение? – grantnz

+1

Это не будет сильно увеличивать производительность, но быстрый совет: замена двух элементов: 'ClassP1 (k, [ii, jj]) = ClassP1 (k, [jj, ii])'. –

+0

grantnz: Я больше беспокоюсь о циклах for, есть ли способ, как не использовать их. Так как Matlab основан на JAVA, это не так быстро с циклами, а для циклов 3 - вложенными. Это сильно меня задерживает. @Robert Спасибо, я попробую это сейчас. –

ответ

2

Вы могли бы быть способный удалить внешний контур поверх k, как это сделать (непроверенный так как у меня нет данных, возможно, потребуется перенастройка):

for i = 1:D-1 
    for j = i+1:D 
     iswap = find(dist(j, 1:th) > dist(i, 1:th)); 
     ClassP1(iswap, [i, j]) = ClassP1(iswap, [j, i]) 
    end 
end 

Я не уверен, если это экономит много читаемость или скорости.

Но какова ваша цель? Кажется, что вы делаете что-то вроде сортировки матрицы ClassP1 на основе матрицы dist (но не совсем). Возможно, есть лучшее решение, использующее [~, idx] = sort(dist), а затем ClassP1(??, idx) = whatever.

Смежные вопросы