Ik gebruik Matlab om de kolommen van een datamatrix random te permuteren (waarbij iedere rij een andere volgorde moet krijgen).
In een loop kan dit heel eenvoudig, bijv:
Nu probeer ik dit te doen op een wat nettere manier (zonder loop) om de code een beetje snel te houden, ook met oudere versies van Matlab.
Ik zit nu van alles te proberen; het is ten eerste simpel om een matrix te maken met daarin de 5 random volgordes, bijv.:
Ik heb al verschillende manieren geprobeerd, maar ik krijg altijd te grote matrices, bijv. van 20x20 of 5x20, terwijl ik bijna zeker weet dat er een simpele oplossing is en ik gewoon iets over het hoofd zie. Heeft iemand raad?
In een loop kan dit heel eenvoudig, bijv:
code:
ff wat data om mee te testen (in de praktijk kan het oplopen tot zo'n 50,000 rijen en 100 kolommen of zo)1
2
3
4
5
6
7
8
| data = [11, 12, 13, 14; 21 22 23 24; 31 32 33 34; 41 42 43 44; 51 52 53 54]
data =
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
51 52 53 54 |
code:
zoals je kunt zien is de volgorde van de rijen gelijk gebleven en is van iedere rij, de volgorde van de kolommen veranderd1
2
3
4
5
6
7
8
9
10
11
| dataperm = zeros(size(data));
for i = 1:5
dataperm(i,:) = data(i,randperm(4));
end
dataperm =
14 12 11 13
22 23 24 21
32 34 33 31
42 41 43 44
51 54 53 52 |
Nu probeer ik dit te doen op een wat nettere manier (zonder loop) om de code een beetje snel te houden, ook met oudere versies van Matlab.
Ik zit nu van alles te proberen; het is ten eerste simpel om een matrix te maken met daarin de 5 random volgordes, bijv.:
code:
Nu is het probleem alleen nog hoe ik nu [data] kan indiceren met [order] (en een hulp matrix of vector voor de rij-indicering) om zoiets te krijgen als hierboven.1
2
3
4
5
6
7
8
| [ignore,order] = sort(rand(5,4),2);
order =
3 4 2 1
1 4 3 2
3 2 1 4
4 1 2 3
3 2 4 1 |
Ik heb al verschillende manieren geprobeerd, maar ik krijg altijd te grote matrices, bijv. van 20x20 of 5x20, terwijl ik bijna zeker weet dat er een simpele oplossing is en ik gewoon iets over het hoofd zie. Heeft iemand raad?