Как случайным образом выбрать x количество индексов из матрицы в Matlab - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь сгенерировать случайно рассеянное, но ограниченное количество единиц в матрице нулей.

Скажем, у меня есть матрица 10x10 нулей (zeros(10)), и я хочу случайным образом разместить десять единиц, чтобы это выглядело как:

     0     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     1     0     0     0     0
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1     0
     1     0     0     0     0     1     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     1     0     0     0     0     0     0
     0     1     0     0     0     0     0     1     0     0
     0     0     0     0     1     0     0     0     0     0
     0     0     1     0     0     0     0     0     0     0

Как я могу сделать это БЕЗ цикла for и без ручного подключения каждой позиции (этот пример является гораздо меньшей версией моей настоящей проблемы)?

Пока мой код:

% Generate zeros
M = zeros(10)
% Generate random indices
Rands = [randsample(10, 10) randsample(10, 10)]

Где первый столбец предназначен для индексов строк, а второй столбец - индексов столбцов.

Теперь я, очевидно, не могу просто поместить эти индексы в индексы строк и столбцов M следующим образом:

M(Rands(:,1), Rands(:,2)) = 1

Как я могу оценить изменения этих случайных индексов?

Ответы [ 2 ]

5 голосов
/ 30 апреля 2019

Вы можете использовать randperm, чтобы случайным образом сгенерировать линейные индексы для заполнения 1:

sz = [10 10]; % desired size
n = 10; % desired number of ones
M = zeros(sz);
M(randperm(prod(sz), n)) = 1;

В качестве альтернативы, вы можете использовать randperm и reshape в одну строку:

M = reshape(randperm(prod(sz))<=n, sz);
4 голосов
/ 30 апреля 2019

Вы можете использовать sub2ind для преобразования подписок в линейный индекс:

M(sub2ind(size(M),Rands(:,1),Rands(:,2)))=1
...