/ / Auto-fill matrix bez powtórzeń wiersza - matlab, matrix, random

Auto-fill matrix bez powtórzeń wiersza - matlab, matrix, random

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 № 1

Jeś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);