Mam serię liczb:
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5]
które chcę losowo wypełnić matrycą 3x5 bez tego samego numeru w tym samym wierszu.
Jak mogę to zrobić w programie Matlab? Potencjalnie mógłbym wybrać losowo wektor testowy i wprowadzić go do macierzy 5x3, ale nie wiem, jak to zrobić, nie otrzymując tej samej liczby w tym samym wierszu.
Odpowiedzi:
1 dla odpowiedzi № 1Jeśli chcesz wypełnić macierz 3 na 5 wszystkich wartości w test
, upewniając się, że w każdym wierszu nie ma powtarzających się wartości, można to zrobić bardzo zwięźle za pomocą toeplitz
aby najpierw wygenerować matrycę indeksu, a następnie losowo permutować wymiary za pomocą randperm
:
index = toeplitz(1:3, [3 5:-1:2]);
index = index(randperm(3), randperm(5));
I próbka index
:
index =
1 5 4 2 3
4 3 2 5 1
5 4 3 1 2
Jeśli twoje wartości w test
są liczby od 1 do 5, to wszystko, co musisz zrobić. Jeśli test
może być jakikolwiek wektor z 5 różnymi liczbami, po trzy z każdej, wtedy możesz dostać wyjątkowy wartości twojego test
wektor i indeksuj je za pomocą index
. To rozwiązanie zostanie uogólnione na dowolne test
wektor:
test = [3 3 3 7 7 7 5 5 5 9 9 9 4 4 4]; % Sample data
uniqueValues = unique(test); % Get the unique values [3 4 5 7 9]
M = uniqueValues(index); % Use index as generated above
Rezultat będzie gwarantowany jako zmieniona wersja tego, co jest test
:
M =
3 9 7 4 5
7 5 4 9 3
9 7 5 3 4
0 dla odpowiedzi nr 2
Możesz wziąć wyjątkowy macierz test i wybierz z niego dowolne trzy elementy i wypełnij wymaganą matrycę 5X3.
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(5,3) ;
for i = 1:size(A,1)
A(i,:) = randsample(test_unique,3) ;
end
randsample potrzebuje zestawu narzędzi statystycznych, jeśli go nie masz, możesz go użyć randperm jak pokazano niżej.
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(5,3) ;
for i = 1:size(A,1)
A(i,:) = test_unique(randperm(length(test_unique),3)) ;
end
Jeśli chcesz macierz 3X5:
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(3,5) ;
for i = 1:size(A,1)
A(i,:) = randsample(test_unique,5) ;
end
0 dla odpowiedzi № 3
Oto brutalny sposób robienia tego
% data
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5];
% randomly permute the indices
indices = randperm(numel(test));
% create a random matrix
matrix = reshape(test(indices), 5, 3);
% while number of unique elements in any of the rows is other than 3
while any(arrayfun(@(x) numel(unique(matrix(x,:))), (1:size(matrix,1)).")~=3)
% keep generating random matrices
indices = randperm(numel(test));
matrix = reshape(test(indices), 5, 3);
end;
% here is the result
result=matrix;
EDYTOWAĆ : Jeśli chcesz 3x5, jak wspomniano w komentarzu, jest o wiele łatwiej. Tylko jedna linia poniżej.
[~, result] = sort(rand(3,5),2);