Do- Schleife verstehen (Summe) < Fortran < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 05:21 Fr 01.07.2011 | Autor: | mathfrag |
Aufgabe | Do i=1,4 !läuft von 1 bis 4
Do j=1,6. !läuft von 1 bis 6
A(i,j, 1:50)= A(i,j,1:50)/ B(i,j)
Enddo
Enddo
!Bemerkung: B wurde davor ausgerechnet, nennen wir es 8 |
Guten Morgen,
Ich benötige etwas Hilfe beim verstehen was das o.g Programm eigentlich macht. Es wäre super, wenn ich dazu einen mathematischen ausdruck
Bekommen wurde.
Mein Gedanke:
Ich wurde das Programm so lesen:
[mm] \bruch{\summe_{i=1}^{4} x_{i}}{\summe_{z=1}^{50} x_{z}} [/mm] + [mm] \bruch{\summe_{j=1}^{6} x_{j}}{\summe_{z=1}^{50} x_{z}} [/mm] + [mm] \bruch{\summe_{z=1}^{50} x_{z}}{\summe_{z=1}^{50} x_{z}} [/mm]
Oder sehe ich das falsch? Ich verstehe die Anweisung A(i,j,1:50)=A(i,j,1:50)/B(i,j) nicht ganz. Wäre toll wenn mir jemand das in Worte erklären konnte.
Vielen Dank
|
|
|
|
Hallo!
A und B sind Arrays, keine Zahlen. Demnach macht dein B=8 auch keinen Sinn.
A ist ein 3D-Array, B ist 2D.
Dein Programm teilt jeden Wert, der im Array a an den Koordinaten i,j,k liegt, durch den Wert von B bei i,j.
i und j werden dabei durch die Schleifen bestimmt, durch die notation mit dem Doppelpunkt macht er das automatisch für alle k von 1 bis 50.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:07 Sa 02.07.2011 | Autor: | mathfrag |
Vielen Dank für deine Antwort.
Leider kann ich mir das nicht vorstellen. Wenn A und B arrays sind, kann ich mir das dann so vorstellen:
A= [mm] \pmat{ 1 & 2 & 3 & 4 \\ 1 & 2 & 3 & 4 & 5 & 6 \\ 1 & 2 & 3 & 4 & 5 & 6 & ... & 50 }
[/mm]
B= [mm] \pmat{ 1 & 2 & 3 & 4 \\ 1 & 2 & 3 & 4 & 5 & 6}
[/mm]
Ich ging davon aus, dass B eine zahl wird, denn am Anfang des Programs steht:
B= sum(A(1:4,1:6,1:50),3) !Dazu Bemerkung,mit (*)vermerkt
B=B/50 ! Dazu Bemerkung mit (**) vermerkt
(*) ICh stelle mir vor, dass hier folgendes geacht wurde:
[mm] \summe_{i=1}^{50} x_{i} [/mm] =1275
(**)
B= 1275/50 = 25,5
Deshalb ging ich davon aus dass es Zahlen sind... ICh stehe aufm Schlauch... :(
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:44 Sa 02.07.2011 | Autor: | novex |
Die Notation von A und B ist sehr merkwürdig...hast da keine genaueren Angaben ??
|
|
|
|
|
Hallo!
B kann keine Zahl sein, weil da ja ein B(i,j) steht, und damit spricht man ein einzelnes Element eines (2D) Arrays an.
Und zu deiner Vorstellung:
A ist ein 3D-Array, wenn du so willst, sind das in dem Fall 50 Tabellen mit jeweils 4 Spalten und 6 Zeilen.
Diese Größen sind Mindestangaben, denn ich habe nicht gesehen, wie A definiert wird. Aber dein Code greift auf diese 4x6x50 Felder zu, daher müssen zumindest die existieren. Es ist auch noch nicht bekannt, welche Werte in A drin stehen, da die bisher noch nirgends explizit gesetzt werden.
Nochmal zur Erläuterung:
Do i=1,4
A(i,3, 10:12)= A(i,3, 10:12) / 5.0
Enddo
Dieser Code teilt die Werte der Spalten 1-4 der dritten Zeile durch 5 - und zwar in der 10, 11, und 12. "Tabelle".
man könnte das auch so schreiben:
Do i=1,4
Do k=10,12
A(i,3, k)= A(i,3, k) / 5.0
Enddo
Enddo
oder ganz kurz:
A(1:4,3, 10:12)= A(1:4,3, 10:12) / 5.0
jetzt zu dem SUM:
B=sum(A(1:4,1:6,1:50)) würde dir tatächlich die Summe aller Werte im Array A zurück geben. Aber
B=sum(A(1:4,1:6,1:50), 3) liefert dir ein Array zurück, in dem alle Werte in der 3. Dimension aufaddiert werden. Das heißt anschaulich, du bekommst eine Tabelle mit 4 Spalten und 6 Zeilen, und in jeder Zelle steht dann die Summe der Werte aus den 50 einzelnen Tabellen von A, die an der gleichen Position stehen.
Vielleicht mal mathematisch:
[mm] A\in\IR^3, B\in\IR^2
[/mm]
[mm] B_{i,j}=\sum_{k=1}^{50}A_{i,j,k}
[/mm]
|
|
|
|
|
Vielen Dank, du hast mir wirklich sehr geholfen. Jetzt wird einiges klarer. Ich möchte sicher gehen das ich es 100% verstanden habe und habe das ganze noch einmal vereinfacht. Ich bitte dich noch einmal drüber zu schaeun und mir zu sagen ob ich richtig liege.
Wir nehmen nun ein vereinfachtes Beispiel an:
B=SUM(A(1:3,1:4,1:2)3)
soweit ich das verstanden habe, bedeutet das also folgendes (Tabellen werden durch || getrennt, werte in der Tabelle sind die Werte des Feldes)
[mm] \vmat{ 5 & 10 & 5 \\ 15 & 20 & 15 \\ 5 & 10 & 15 } [/mm] + [mm] \vmat{ 15 & 10 & 10\\ 15 & 20 & 5 \\ 5 & 5 & 15 } [/mm] = [mm] \vmat{ 20 & 20 & 15 \\ 30 & 40 & 20 \\ 10 & 15 & 30 }
[/mm]
mit B=B/5 erhalte ich also
[mm] \vmat{ 4 & 4 & 3 \\ 6 & 8 & 4 \\ 2 & 3 & 6 }
[/mm]
weiter mit
A(1:3,1:4,1:2)=A(1:3,1:4,1:2)/B(1:3,1:4)
habe ich also:
[mm] \vmat{ 5 & 10 & 5 \\ 15 & 20 & 15 \\ 5 & 10 & 15 } \vmat{ 15 & 10 & 10\\ 15 & 20 & 5 \\ 5 & 5 & 15 } [/mm]
und diese 2 Tabellen jeweils teilen mit
B(1:3,1:4)= [mm] \vmat{ 4 & 4 & 3 \\ 6 & 8 & 4 \\ 2 & 3 & 6 }
[/mm]
somit habe ich bekomme ich 2 Tabellen zurück mit:
[mm] \vmat{ 5/4 & 10/4 & 5/3 \\ 15/6 & 20/8 & 15/4 \\ 5/2 & 10/3 & 15/6 } \vmat{ 15/4 & 10/4 & 10/3\\ 15/6 & 20/8 & 5/4 \\ 5/2 & 5/3 & 15/6 } [/mm]
stimmt das?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:25 Mo 04.07.2011 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:37 Sa 02.07.2011 | Autor: | mathfrag |
Hallo,
nochmals vielen Dank.
Was ist wenn eine 4te Dimension dazu kommt? Wie darf ich mir das dann vorstellen?
zB C(a,b,c,d)
dann sind es c Tabellen mit jeweils b Zeilen, a Spalte und wofür steht das "d"?
ICh danke vielmals!!!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:25 Sa 02.07.2011 | Autor: | Infinit |
Hallo mathfrag,
an dem Prinzip ändert sich nichts, allerdings haben wir Menschen Schwierigkeiten beim Vorstellen von vier Dimensionen, eine anschauliche räumliche Beschreibung kann ich Dir deswegen auch nicht geben. Die Frage ist ja auch mehr, was in solchen "Hypertabellen" abgespeichert würde und da kann man sich natürlich aus der Physik heraus einiges vorstellen. Ein räumliches Gebilde, das für Dich anschaulich ist, kannst Du damit aber nicht mehr verbinden.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:31 Sa 02.07.2011 | Autor: | mathfrag |
Danke...
aber wie kann ich es dann berechnen, wenn ich es z.B "per Hand" ausrechnen möchte?
diese 2 Fragen gehen mir nicht aus dem Kopf:
1)
was ist eigentlich der unterschied zwischen (:) und (1:5).
(1:5) bedeutet z.B, dass i von 1 bis 5 läuft, aber was bedeutet nur (:) ? Ist das ähnlich?
2)
was bedeuten / in einer Klammer... zum Beipsiel
wo ist der unterschied zwischen:
lendim= (/3,4,q,2/) und lendim(3,4,q,2)
Ich danke euch vielmals!!!!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:40 So 03.07.2011 | Autor: | Infinit |
Hallo mathfrag,
bei der Initialisierung von Feldern kann man diese gleich mit Werten belegen, dies ist die (/ ... /)-Schreibweise.
Der Doppelpunkt ist eine Kurzschreibweise, die einfach besagt, dass alle Werte des Laufindex dieser Dimension benutzt werden sollen. Diese müssen woanders jedoch zugeordnet worden sein. Das wird gerne beim Ansprechen von Teilfeldern benutzt.
Einen recht schönen Überblick findest Du hier.
Viele Grüße von einem, der noch mit Fortran 77 anfing,
Infinit
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:11 So 03.07.2011 | Autor: | mathfrag |
vielen Dank für deine ausführlichen Antworten. Leider drehe ich mich im Kreiss. Kannst du mir einen Tipp geben, wie ich Fortranschleifen in mathematischen Ausdrücke umformulieren kann und umgekehrt?
zum Beispiel:
wenn ich die
dann schreibe ich bestimmt
do i=1,500
x(:)=x+i (oder so ähnlich)
aber wie lese ich es umgekehrt? Ich arbeite zum ersten mal mit Fortran und habe große schwierigkeiten.
Mein HAuptproblem:
wie schreibe ich zum Beispiel folgendes in Forel um:
x=sum(a(1:4,1:5,1:6)3) (*)
x= x/6 (*)
do i=:4
do i=1:5
a(i,j,1:10)=a(i,j,1:10)/x(i,j) (**)
endo
endo
kann ich das so aufschreiben?
x=
für (*), wenn i=1:4, j=1:5, k=1,6
und für (**) ?? :(
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:01 So 03.07.2011 | Autor: | Infinit |
Hallo mathfrag,
auf Deine Interpretationsrichtung bin ich bisher noch nie gestoßen, schließlich ist Fortran ja die Abkürzung for Formula Translator. Generell kann man sagen, dass es sich bei verschachtelten Schleifen lohnt, diese von der inneren bis zur äußeren Schleife aufzulösen. Das Gleichheitszeichen hat ja nicht die Aufgabe, eine mathematische Gleichheit herzustellen, sondern es ist nur der Hinweis, dass der Wert eines Ausdrucks einer Variablen zugeordnet wird. So etwas wie
do i = 1, 10
do j = 1, i
do k = -4, 5
b(i) = a(j,k)/ 5
end do
end do
end do
könnte man schreiben als
b(i) für alle i in [1,10] =: a(j,k) / 5 für alle k in [-4,5] und j in [1, i]
aber warum sollte ich so etwas tun wollen? Normalerweise habe ich ein mathematisches Problem und versuche es, in Fortran umzusetzen.
Ich weiss, dass dies am Anfang gewöhnungsbedürftig ist, aber hier hilft nur üben.
Viel Erfolg und viel Spaß dabei,
Infinit
|
|
|
|