У меня проблема. У меня есть матрица нулей 600x600. Мне нужно заполнить эту матрицу 1080 1 случайным образом. Какие-либо предложения?

1
popist 4 Янв 2016 в 14:17

3 ответа

Лучший ответ

Или используйте внутреннюю процедуру randperm следующим образом:

A = zeros(600);
A(randperm(600^2,1080)) = 1;
6
High Performance Mark 4 Янв 2016 в 11:38
A = sparse(600,600);               %// set up your matrix
N=1080;                            %// number of desired ones
randindex = randi(600^2,N,1);      %// get random locations for the ones
while numel(unique(randindex)) ~= numel(randindex)
    randindex = randi(600^2,N,1);  %// get new random locations for the ones
end 
A(randindex) = 1;                  %// set the random locations to 1

При этом используется randi для случайного генерирования чисел 1080 между 1 и 600^2, т.е. всеми возможными местоположениями в ваших векторах. Цикл while используется на тот случай, если одно из местоположений встречается дважды, в результате чего получается менее 1080 1.

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

Большая разница в производительности по сравнению с другими ответами заключается в том, что это инициализирует разреженную матрицу, поскольку 1080/600^2 = 0.3% очень разреженный и, следовательно, будет быстрее. (Спасибо @ Dev-iL)

3
Community 23 Май 2017 в 12:30

Это один из способов сделать это,

N = 1080; % Number of ones
M = zeros(600); % Create your matrix
a = rand(600^2,1); % generate a vector of randoms with the same length as the matrix
[~,asort] = sort(a); % Sorting will do uniform scrambling since uniform distribution is used
M(asort(1:N)) = 1; % Replace first N numbers with ones.  
2
patrik 5 Янв 2016 в 07:16