Matrix laufen lassen < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | 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
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | 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
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | 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.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | 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
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | 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.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:48 Sa 13.03.2010 | Autor: | JanaS |
Hallo!
Das Problem hat sich gelöst! Vielen Dank!
Viele Grüss, Jana
|
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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
|
|
|
|
|
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
|
|
|
|