2013-03-28 20 views
5

MatlabCzy randperm() może generować kilka losowych permutacji?

p = randperm (n, k) zwraca wektor k rząd zawierający unikalne całkowite wybranych losowo od 1 do n włącznie.

Czy można wywołać funkcję randperm(), zwracając kilka wierszy wektorów, z których każdy jest taki, jak powyżej? Jeśli nie, czy istnieje inny sposób generowania kilku losowych permutacji?

Czy omijanie pętli będzie w tym przypadku szybsze?

Dzięki!

Odpowiedz

5

sam zwraca tylko jedną permutację. Jeśli chcesz uniknąć pętli można nazwać to z ARRAYFUN:

Nperm = 5; 
N = 6; 
result = arrayfun(@(x)randperm(N),(1:Nperm)','UniformOutput',0); 

ten powróci Nperm x 1 tablicę komórek. Aby przekonwertować go do macierzy można użyć CELL2MAT:

result = cell2mat(result); 

Istnieje również PERMS funkcja, która zwraca wszystkie permutacje, ale to tylko praktyczne dla małych liczb.

Sprawdź także przesyłanie do pliku FileExchange ALLCOMB, PERMS i others.

+0

Czy unikanie lop niekoniecznie będzie szybsze? – Tim

+1

Nie jest to konieczne, szczególnie w tym przypadku arrayfun zwraca tablicę komórek, która może spowolnić działanie. Ale możesz przetestować z tic/toc. – yuk

1

Jeżeli wymagają, aby wszystkie permutacje są wzajemnie wyjątkowy, a następnie można użyć następujących

permN = 5; 
permK = 4; 
nPerms = 10; 
nGoodPerms = 0; 
nMaxFailedTries = 100; 
nFailedTries = 0; 

permList = cell(nPerms, 1); 

while nGoodPerms < nPerms && nFailedTries <= nMaxFailedTries 
    candidatePerm = randperm(permN, permK); 
    if any(cellfun(@(x)~isempty(x) && all(x == candidatePerm), permList)) 
     nFailedTries = nFailedTries + 1; 
    else 
     nGoodPerms = nGoodPerms + 1; 
     permList{nGoodPerms} = candidatePerm; 
    end 
end 

permList = cell2mat(permList{1:nGoodPerms}); 

prawdopodobnie powinien rzucić ostrzeżenie tam (lub błędu) jeśli nie wszystkie wnioskowane permutacje zostały wygenerowane. Można również dodać kontrolę wstępną, aby upewnić się, że nPerms nie jest głupio duża (tj. Bardziej unikalne permutacje niż kiedykolwiek mogłyby być wygenerowane z podanymi permN i permK).

1

chodzi o p = randperm(n):

w Matlab 2010a i starszych, parametr wejściowy k nie jest obsługiwany. Jeśli spojrzeć na randperm „s kodu

[~, p] = sort(rand(1,n)); 

zobaczysz, że jest to bardzo proste, aby go zmodyfikować tak, że produkuje m permutacje n elementów (wynik ma teraz rozmiar m x n)

[~, p] = sort(rand(m,n), 2); 

chodzi o p = randperm(n,k):

nie wiem jak Matlab robi to w tym przypadku, ponieważ mojej wersji nie obsługuje tego. Zawsze możesz zrobić jak wyżej, a następnie wykończenia:

p = p(:,1:k); 

Nie bardzo skuteczny dla k znacznie mniejszy niż n, choć.

Powiązane problemy