Toon posts:

[Matlab] Optimalisatie routine *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zou graag het volgende stukje matlab-code willen optimaliseren:

code:
1
2
3
4
5
for x = 1:256
  for y = 1:256
    newimg(257-y,x,:) = img(x,y,:);
  end
end


... wat eigenlijk neerkomt op het verwisselen van 2 dimensies en het 'reversen' van een dimensie.
Ben al wat aan het klooien geweest met functies (circ)shift en flipdim, maar kom er niet echt uit :-(.

Wie zo ziet hoe het moet mag het zeggen :) Bij voorbaat dank..

edit:

Ik zie nu dat ik dit bericht per ongeluk in Software Algemeen heb geplaatst, terwijl het meer thuishoort in 'Programming etc' natuurlijk ; mijn excuses.

[ Voor 29% gewijzigd door Verwijderd op 02-12-2003 14:23 ]


Verwijderd

Topicstarter
Nou moe :/ Niemand?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 18:25

momania

iPhone 30! Bam!

We zijn hier allemaal gewoon mensen die ook andere dingen te doen hebben dan alleen jou helpen :/

Het opnieuw onder de aandacht brengen ('kicken') van je topic, mag daarom pas na 24u.
Zie ook Algemene regels hoe je op het forum te gedragen (Netiquette)

Neem je whisky mee, is het te weinig... *zucht*


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

[F_J_Knip verhaal over kicken, zie boven]

Ondertussen SA --> PW :)
edit:
momania :w

[ Voor 28% gewijzigd door F_J_K op 02-12-2003 14:48 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Matlab:
1
matrix1 = matrix2';   %let op het accent!

Verwijderd

Topicstarter
Dit geeft:

"Transpose on ND array is not defined."

ND zal "N-dimensional" betekenen? Het is namelijk een 256x256x23 matrix. Om het wat concreter te maken: het is een breinvolume, bestaande uit 23 slices van 256x256 pixels. Elke slice moet 90 graden 'gekanteld' worden, wat ik momenteel dus met de (wel erg trage) dubbele loop doe zoals hierboven weergegeven.

Hmm, ik zal eens proberen om elke slice afzonderlijk te transposen. Dit is wel een 90-graden rotatie, maar betwijfel of het toevallig ook nog de juiste kant op is :-)

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Volgens mij kan je in Matlab complete kolommen verwisselen, dus je kan eerst gewoon kolom 1 met 256 wisselen, 2 met 255, etc. Als dat niet zo is, kan je tenminste complete kolommen tegelijk aan een nieuwe array toekennen en daarna transponeren.

Wie trösten wir uns, die Mörder aller Mörder?


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Voor 'kantelen' of omdraaien van matrices bestaat er naar mijn weten geen commando behalve het gebruik van uitermate trage loops.

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
90 graden naar rechts draaien is een transpose gevolgd door een reverse van de rijen (of een rechtervermenigvuldiging met een nul-matrix met 1-en op de antidiagonaal).
90 naar links is transpose gevolgd door een reverse van de kolommen (of een linkervermenigvuldiging met een nul-matrix met 1-en op de antidiagonaal)

Maar ik heb nooit met Matlab gewerkt, dus ik weet niet hoe efficient dit is en of er functies voor zijn...

[ Voor 24% gewijzigd door RickN op 03-12-2003 13:06 ]

He who knows only his own side of the case knows little of that.


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Een matrix roteren kan simpel met B = rot90(A,k)

| Toen / Nu


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Kewl, weer wat geleerd. Werkt dit overigens ook voor arrays met een dimensie hoger dan 2?

offtopic:
Vet icon btw d:)b

Verwijderd

Topicstarter
OpifexMaximus schreef op 03 december 2003 @ 14:01:
[...]

Kewl, weer wat geleerd. Werkt dit overigens ook voor arrays met een dimensie hoger dan 2?
Ik krijg het volgende:

??? Error using ==> rot90
A must be a 2-D matrix.

Kennelijk niet dus :-). Maar ik zou nog wel even kunnen proberen om 23 keer een slice te gaan roteren.. Dat zou sowieso al sneller moeten zijn dan die 256*256 lus...

Thanks voor de rot90-tip!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Het kan ook zonder loop :)
Matlab:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>> d=[4 3 2];
>> A=reshape([1:prod(d)],d);
>> B=permute(A(:,[d(2):-1:1],:),[2 1 3]);
>> A,B
A(:,:,1) =
     1     5     9
     2     6    10
     3     7    11
     4     8    12
A(:,:,2) =
    13    17    21
    14    18    22
    15    19    23
    16    20    24
B(:,:,1) =
     9    10    11    12
     5     6     7     8
     1     2     3     4
B(:,:,2) =
    21    22    23    24
    17    18    19    20
    13    14    15    16
>>

Uitleg:
De eerste 2 regels maken een 4x3x2 matrix A om mee te testen.
A(:,[d(2):-1:1],:) keert de index van de 2e dimensie om.
permute(X,[2 1 3]) verwisselt dimensie 1 en 2. permute() is een algemene versie van transpose().

| Toen / Nu


Verwijderd

Topicstarter
Bedankt! Ik zal het proberen ...
Pagina: 1