[Matlab] kolommen random permuteren

Pagina: 1
Acties:
  • 116 views sinds 30-01-2008
  • Reageer

  • RikTW
  • Registratie: Januari 2004
  • Laatst online: 23-04 20:17
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:
code:
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
ff wat data om mee te testen (in de praktijk kan het oplopen tot zo'n 50,000 rijen en 100 kolommen of zo)
code:
1
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
zoals je kunt zien is de volgorde van de rijen gelijk gebleven en is van iedere rij, de volgorde van de kolommen veranderd

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:
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
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.
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?

  • BKJ
  • Registratie: April 2000
  • Laatst online: 16-04 16:06

BKJ

Ik zou het zoeken in de hoek dat je vermenigvuldigt met een random 0,1 matrix zodat de uitkomst een gepermuteerde matrix is. Misschien dat dat efficienter werkt?

Kamer huren


  • RikTW
  • Registratie: Januari 2004
  • Laatst online: 23-04 20:17
hitchhacker schreef op vrijdag 09 september 2005 @ 11:24:
Ik zou het zoeken in de hoek dat je vermenigvuldigt met een random 0,1 matrix zodat de uitkomst een gepermuteerde matrix is. Misschien dat dat efficienter werkt?
Ik begrijp niet helemaal wat je bedoelt ben ik bang.

Ik heb ondertussen wel een oplossing gevonden:
Na een paar uur klooien met multiple subscripts, bleek het heel makkelijk te doen zijn door niet subscripting te gebruiken (met aparte rij- en kolom indices) maar simpelweg de order-matrix te veranderen in de juiste enkelvoudige (lineaire) indices) (en nog een beetje huishoudelijk draaien en keren :X )