Sampling with periodic replacement

6 visualizaciones (últimos 30 días)
Matt J
Matt J el 31 de Dic. de 2018
Editada: Walter Roberson el 1 de En. de 2019
I am looking for an efficient way of doing randperm(n,k) many successive times with the same n and k. Can anyone propose something more efficient than the obvious for-loop approach below?
M=1e5;
n=100;
k=10;
A=nan(k,M);
for i=1:M
A(:,i) = randperm(n,k).';
end

Respuesta aceptada

Walter Roberson
Walter Roberson el 31 de Dic. de 2018
In current versions of MATLAB, randperm with small k relative to n (and perhaps other cases) uses a Fisher-Yates shuffle for efficiency.
Older versions of MATLAB use sort(rand) to extract orderings. That can be extended easily:
[~, A] = sort( rand(n, M) );
  2 comentarios
Matt J
Matt J el 1 de En. de 2019
Editada: Matt J el 1 de En. de 2019
Ah! Thanks. I suppose we should use mink/maxk, though, for Matlab versions that have it
[~, A] = mink( rand(n, M) , k ); ?
Walter Roberson
Walter Roberson el 1 de En. de 2019
Editada: Walter Roberson el 1 de En. de 2019
Good idea. On older systems, you would use A(1:k,:)
... Though I just did some timing tests, and using sort and indexing turns out to be measurably faster. Using sort and indexing is bout 0.125 for the parameters you indicate, vs about 0.156 for using mink.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Logical en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by