www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Matrix laufen lassen
Matrix laufen lassen < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Matrix laufen lassen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 14:26 Mi 10.03.2010
Autor: JanaS

Hallo!

Ich möchte eine Matrix M(a:b,a:b) über eine andere Matrix grösserer Abmessung F(Höhe,Breite) laufen lassen. Ich möchte also, dass diese Matrix z.B. als M(3x3) zuerst die ersten 9 Elemente 1:3,1:3 der Matrix F annimmt (die dann weiterbehandelt werden), dann die Elemente 2:4,1:3 und so weiter.
Die Matrix M ist symmetrisch. Und dass ich die Randbereiche gesondert behandeln muss, weiss ich. Aber wie mache ich das grundsätzlich?

Vielen Dank und viele Grüsse von Jana

        
Bezug
Matrix laufen lassen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 17:21 Mi 10.03.2010
Autor: JanaS


> Hallo!
>  
> Ich möchte eine Matrix M(a:b,a:b) über eine andere Matrix
> grösserer Abmessung F(Höhe,Breite) laufen lassen. Ich
> möchte also, dass diese Matrix z.B. als M(3x3) zuerst die
> ersten 9 Elemente 1:3,1:3 der Matrix F annimmt (die dann
> weiterbehandelt werden), dann die Elemente 2:4,1:3 und so
> weiter.
>  Die Matrix M ist symmetrisch. Und dass ich die
> Randbereiche gesondert behandeln muss, weiss ich. Aber wie
> mache ich das grundsätzlich?
>  
> Vielen Dank und viele Grüsse von Jana

Also bisher habe ich versucht:

Die Dimensionen der Matrix M sind 2*radius+1

for i = 1:höhe - 2*radius    % i läuft von 1 bis höhe-2*radius
    for j = 1:breite - 2*radius      % j läuft von 1 bis breite-2*radius
        M_teil = M(i:i+2*radius,j:j+2*radius)     % M_teil soll die Teilmatrix aus F sein, deren Breite von i bis i+2*radius geht, Höhe analog
         ...weiterbehandlung von F-teil...
    end
end

Was ich mir erhofft hatte, war, dass M_teil eben diese Werte der Matrix annimmt. Also zuerst die ersten 9 Elemente 1:3,1:3 der Matrix F annimmt (die dann weiterbehandelt werden), dann die Elemente 2:4,1:3 und so weiter. Aber das funktioniert so leider nicht :-(.

Habt Ihr Tipps, wo meine Fehler liegen könnten?

Viele Grüsse von Jana

Bezug
                
Bezug
Matrix laufen lassen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 09:18 Do 11.03.2010
Autor: straussy

Was funktioniert denn da nicht? Gibts ne Fehlermeldung oder ist die Matrix M_teil nicht wie gewünscht. Für mich sieht das richtig aus.

Bezug
                        
Bezug
Matrix laufen lassen: Frage (reagiert)
Status: (Frage) reagiert/warte auf Reaktion Status 
Datum: 11:00 Do 11.03.2010
Autor: JanaS


> Was funktioniert denn da nicht? Gibts ne Fehlermeldung oder
> ist die Matrix M_teil nicht wie gewünscht. Für mich sieht
> das richtig aus.  

Richtig sieht es für mich Laie auch aus :-). Nein, es gibt keine Fehlermeldung. Das Problem ist, dass die kleine Matrix nicht "läuft". Sie nimmt einmal die ersten Werte (also 1:3,1:3) an und läuft dann nicht weiter zu 2:4,1:3 usw...

Viele Grüsse, Jana

Bezug
                                
Bezug
Matrix laufen lassen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 11:19 Do 11.03.2010
Autor: straussy

Kann es sein, dass du i oder j nochmal innerhalb der Schleife verwendest? Ansonsten kannst du ja mal den kompletten Code posten, falls das nicht zu viel ist.

Bezug
                                        
Bezug
Matrix laufen lassen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 13:48 Sa 13.03.2010
Autor: JanaS

Hallo!

Das Problem hat sich gelöst! Vielen Dank!

Viele Grüss, Jana

Bezug
        
Bezug
Matrix laufen lassen: Antwort
Status: (Antwort) fertig Status 
Datum: 10:31 Do 11.03.2010
Autor: supermarche

Hi,

ich habe das ganze Mal kurz in python durchgetippt, und du willst ja anscheinend Folgendes haben:
[mm] \pmat{ 0 & 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 & 9 \\ 10 & 11 & 12 & 13 & 14 \\ 15 & 16 & 17 & 18 & 19} [/mm]
[mm] \br [/mm]
[mm] \pmat{ 0 & 1 & 2 \\ 5 & 6 & 7 \\ 10 & 11 & 12} [/mm]
[mm] \pmat{ 5 & 6 & 7 \\ 10 & 11 & 12 \\ 15 & 16 & 17} [/mm]
[mm] \pmat{ 1 & 2 & 3 \\ 6 & 7 & 8 \\ 11 & 12 & 13} [/mm]
[mm] \pmat{ 6 & 7 & 8 \\ 11 & 12 & 13 \\ 16 & 17 & 18} [/mm]
...

Dazu verstehe ich in deinem Beispiel nicht ganz die Funktion von Radius. Es soll doch so sein, dass M_teil die dim (radius x radius) hat oder? Da ist es in den Zählschleifen aber nicht angebracht, 2xradius zu subtrahieren, sondern für jede Dimension i, j nur einmal. Eventuell solltest du in der Zählschleife auch die zweite Angabe in Klammern setzen (kenne mich mit der Matlab Syntax nicht so aus): for i = 1:(....)

mfg
supermarche

Quellcode:

##### p y t h o n #####
from numpy import arange

radius = 3
hoehe = 4
breite = 5

M = arange(hoehe*breite).reshape(hoehe, breite)
print M

for i in arange(breite-radius+1):
    for j in arange(hoehe-radius+1):
        M_teil = M[j:j+radius, i:i+radius]
        print M_teil

Bezug
                
Bezug
Matrix laufen lassen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 11:08 Do 11.03.2010
Autor: JanaS


> Hi,
>  
> ich habe das ganze Mal kurz in python durchgetippt, und du
> willst ja anscheinend Folgendes haben:
>  [mm]\pmat{ 0 & 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 & 9 \\ 10 & 11 & 12 & 13 & 14 \\ 15 & 16 & 17 & 18 & 19}[/mm]
>  
> [mm]\br[/mm]
>  [mm]\pmat{ 0 & 1 & 2 \\ 5 & 6 & 7 \\ 10 & 11 & 12}[/mm]
>  [mm]\pmat{ 5 & 6 & 7 \\ 10 & 11 & 12 \\ 15 & 16 & 17}[/mm]
>  
> [mm]\pmat{ 1 & 2 & 3 \\ 6 & 7 & 8 \\ 11 & 12 & 13}[/mm]
>  [mm]\pmat{ 6 & 7 & 8 \\ 11 & 12 & 13 \\ 16 & 17 & 18}[/mm]
>  
> ...

Ja genau! Das will ich haben. Und diese kleinen Matrizen sollen dann über diverse andere Formeln umgerechnet werde. Im Endeffekt kommt dabei ein Skalar heraus, der den Mittelpunkt der kleine Matrix ersetzt. Diese Weiterbehandlung funktioniert auch. In Deinem Beispiel würde die erste Matrix den Punkt 6 ersetzen und damit, wenn die kleine Matrix durchgelaufen ist, nach und nach ein neues Bild erstellen.

>  
> Dazu verstehe ich in deinem Beispiel nicht ganz die
> Funktion von Radius. Es soll doch so sein, dass M_teil die
> dim (radius x radius) hat oder? Da ist es in den
> Zählschleifen aber nicht angebracht, 2xradius zu
> subtrahieren, sondern für jede Dimension i, j nur einmal.
> Eventuell solltest du in der Zählschleife auch die zweite
> Angabe in Klammern setzen (kenne mich mit der Matlab Syntax
> nicht so aus): for i = 1:(....)

Die kleine Funktion hat die Dimension 2*radius+1 x 2*radius+1 (in Deinem Beispiel wäre radius=1). Deshalb muss ich 2*radius abziehen und die Ränder dann gesondert behandeln.
Die Klammern haben leider nichts gebracht, das hatte ich auch schon versucht. Nach wie vor wird die kleine Matrix einmal erstellt und umgerechnet und läuft nicht weiter zu 2:4,1:3.

Viele Grüsse, Jana

> mfg
>  supermarche
>  
> Quellcode:
>  
> ##### p y t h o n #####
>  from numpy import arange
>  
> radius = 3
>  hoehe = 4
>  breite = 5
>  
> M = arange(hoehe*breite).reshape(hoehe, breite)
>  print M
>  
> for i in arange(breite-radius+1):
>      for j in arange(hoehe-radius+1):
>          M_teil = M[j:j+radius, i:i+radius]
>          print M_teil


Bezug
                        
Bezug
Matrix laufen lassen: Antwort
Status: (Antwort) fertig Status 
Datum: 11:33 Do 11.03.2010
Autor: supermarche

Hi,

Zur Randbehandlung: du möchtest, wenn ich das richtig verstanden habe, mit dem Radius die Größe um das Zentralelement von M_teil angeben? Dann sollte der Matlab-Code in etwa so aussehen:

Definition:
radius = 1
M = (höhe x breite) mit höhe, breite => (2*radius + 1)

A = [0 1 2 3 4 ; 5 6 7 8 9 ; 10 11 12 13 14 ; 15 16 17 18 19 ];
hoehe = 4;
breite = 5;
radius = 1;

for i = 1:hoehe - 2*radius  
    for j = 1:breite - 2*radius
        M_teil = A(i:i+2*radius,j:j+2*radius)
    end
end

<. im Grunde ist das dein Code (ich würde eventuell noch die Umlaute weglassen, weiß nicht inwiefern Matlab das unterstützt). Es kann jetzt eigentlich nur noch an der Definition deiner Größen liegen. Du wanderst auch im Gegensatz zu deiner Beschreibung nicht zu erst vertikal sondern horizontal. Wenn die Zerlegung aber erst vertikal, und dann horizontal erfolgen soll, müssen die beiden Schleifen vertauscht werden:

A = [0 1 2 3 4 5 6; 7 8 9 10 11 12 13 ; 14 15 16 17 18 19 20 ; 21 22 23 24 25 26 27 ; 28 29 30 31 32 33 34];
hoehe = 5;
breite = 7;
radius = 1;

for j = 1:breite - 2*radius
    for i = 1:hoehe - 2*radius
        M_teil = A(i:i+2*radius, j:j+2*radius)
    end
end

mfg
supermarche

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]