Как переписать несколько циклов for для оптимизации скорости в Matlab? - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу, чтобы мой код работал быстрее, и этот раздел, кажется, заставляет код работать медленнее.

Я пытался векторизовать его и использовать сетку, но не смог разобраться.

%generate all noma node combinations with packets
combinations_withpackets=[];
for i=1:N
    for j=1:N
        if(i~=j)
           for k=1:N
               if((k~=i)&&(k~=j))
                   if((packets(i,j)>0)&&(packets(i,k)>0))   
                       combinations_withpackets=[combinations_withpackets;i j k];
                   end
               end
           end
        end
    end
end

Это должно создать массив вида [i j k], где i, j и k являются узлами, и в каждой строке массива они не равны друг другу.

Добавляет комбинацию [i j k] к combinations_withpackets, если есть пакеты от узла i до j и узла i до k.

1 Ответ

0 голосов
/ 05 февраля 2019

Если я создаю случайную матрицу packets:

N       = 50                %size of the packets matrice
packets = round(rand(N,N)); %random matrice
comb    = nchoosek(1:N,3);  %all combination without permutation
combrow = perms(1:3);       %permutation for dimension 3
comb    = reshape(comb(:,combrow),[],3); %all combination with permutation
f1      = find(packets(sub2ind([N,N],comb(:,1),comb(:,2)))>0); %check condition 1
f2      = find(packets(sub2ind([N,N],comb(:,1),comb(:,3)))>0); %check condition 2
ind     = ismember(f1,f2); %check condition 1&&2
cwp     = comb(f1(ind),:);   %get the result

Это должно быть намного быстрее, чем решение для цикла.

Этот алгоритм производит (N-2)*(N-1)*(N) комбинаций (как объясненоАндер Бигури, это почти O (N ^ 3)), поэтому для больших N он будет занимать много памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...