Daten in Matrix aufreihen < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:16 Fr 25.09.2009 | Autor: | LN- |
Ich habe diese Frage auch in folgenden Foren auf anderen Internetseiten gestellt: http://www.gomatlab.de/viewtopic,p,29982.html#29982
Hallo,
ich bin ziemlicher Matlab Neuling und bisher konnte ich jedes Problem mit Googel etc lösen. Nur dieses lässt mir einfach keine Ruhe.
Hier der Code:
A=fem.sol.u;
B=fem.sol.tlist;
C=fem.mesh.p;
D=1.58e-11;
[mc,nc]= size(C');
[ma,na]=size(A);
A(mc+1:ma,:)=[];
A(:,na+1)=C';
E=sortrows(A,na+1); %sortieren nach na+1
[me,ne]=size(E);
Tabelle=B;
Tabelle(2:me+1,ne-1)=0; %Nullen setzen
[mt,nt]=size(Tabelle);
hx=E(:,ne);
for f=E(:,1:ne-1)
n=1:ne-1
grad=gradient(f,hx)
Tabelle(2:mt,n)=grad;
end
Ich habe Daten aus Femlab exportiert, daraus Matrizen erstellt, gekürzt, zusammengefügt und nach der letzten Spalte sortiert.
Dann wird eine Tabelle erstellt, die erste Zeile ist durch B definiert und der Rest wird mit Nullen aufgefüllt, damit ich später etwas einfügen kann.
Dann wird hx definiert als die letzte Spalte von E
und nun kommt mein Problem: ich brauche eine Schleife, welche von der 1. bis zur vorletzten Spalte von E jeweils die Spalte nimmt und dann den gradienten abhängig von hx berechnet (mit einzel extrahierten Spalten funktioniert es, ich brauch es aber der Reihe nach für alle Spalten.)
Das klappt auch soweit noch, dann soll er es aber in "Tabelle" schreiben und zwar beginnend in der 2. Zeile und jeweils eine weiter nach rechts. Deswegen habe ich n=1:ne-1 gesetzt. Allerdings funktioniert dies nicht. Kann mir hier jemand helfen, wie ich die Werte nacheinander eingereiht bekomme? Ich habe bereits versucht eine zweite Schleife in die erste zu integrieren, dann schreibt er aber nur den jeweils letzten berechneten Gradienten in alle Spalten.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:47 Fr 25.09.2009 | Autor: | Frasier |
> ...dann soll er es aber in
> "Tabelle" schreiben und zwar beginnend in der 2. Zeile und
> jeweils eine weiter nach rechts. Deswegen habe ich n=1:ne-1
> gesetzt. Allerdings funktioniert dies nicht. Kann mir hier
> jemand helfen, wie ich die Werte nacheinander eingereiht
> bekomme? Ich habe bereits versucht eine zweite Schleife in
> die erste zu integrieren, dann schreibt er aber nur den
> jeweils letzten berechneten Gradienten in alle Spalten.
Hallo,
kannst du mal ein konkretes Beispiel geben, wie das aussieht/aussehen soll?
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:49 Fr 25.09.2009 | Autor: | LN- |
Hallo,
Danke für die Reaktion!
das soll so aussehen:
1. Zeile die Werte aus B, da stehen in dem Fall Zahlen von 0-250 drin und dann kommen hier 16 weitere Zeilen, in welche pro Spalte (welche von 1-n gezählt wird) der 16 zeilige grad-Vektor (hier als gradf eingegeben, wobei die Werte pro Zeile natürlich unterschiedlich sind) eingetragen werden soll
also:
[mm] \begin{matrix}
0 & 1 & 2 &3 &4 & 5 & 6 & 7 & ...\\
gradf1 & gradf2 & gradf3 & gradf4 & gradf5 & gradf6 & gradf7 & gradf8 & ...\\
gradf1 & gradf2 & gradf3 & gradf4 & gradf5 & gradf6 & gradf7 & gradf8 & ...\\
\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & ...\\
\end{matrix}
[/mm]
Die Sache funktionert wenn ich eine zweite Schleife einbaue:
for f=E(:,1:ne-1)
for n=1:ne-1
grad=gradient(f,hx);
Tabelle(2:mt,n)=grad;
end
end
und dann wird halt überall die letzte Lösung von grad eingefügt. Ich will aber eben immer das zu f gehörende Ergebnis von der jeweilgen Spalte aus E fortlaufend eingetragen haben.
Ich hoffe das war so verständlich.
Vielen Dank,
Gruß Ellen
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:41 Fr 25.09.2009 | Autor: | Frasier |
Hallo,
ehrlich gesagt verstehe ich das nicht...
Kannst du mal einen Code schreiben, den ich ausführen kann?
Z.B. sowas:
E=rand(11);
B=0:11;
ne=12;
mt=12;
hx=0.1;
Tabelle(1,:)=B;
for f=E(:,1:ne-1)
for n=1:ne-1
grad=gradient(f,hx);
Tabelle(2:mt,n)=grad;
end
end
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:12 Mo 28.09.2009 | Autor: | LN- |
Hallo,
Ah klar, ich verstehe, du hast natürlich meine Simulationsdaten nicht...
Hier kommt der Code verallgemeinert:
B=(0:19);
E=rand(16,20);
[ma,na]=size(E)
C=(1:16)
E(1:16,na+1)=(C')
[me,ne]=size(E);
Tabelle=B;
Tabelle(2:me+1,ne-1)=0;
[mt,nt]=size(Tabelle);
hx=E(:,ne);
for f=E(:,1:ne-1)
n=1:ne-1
grad=gradient(f,hx);
Tabelle(2:mt,n)=grad;
end
ich hoffe, jetzt ist es ersichtlicher! Vielen Dank für die Hilfe!
mfg Ellen
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:12 Mo 28.09.2009 | Autor: | Frasier |
Hey, diese Code läuft aber nicht.
grad ist 16x1, n aber 1x20 groß, das passt nicht.
Hattest du es nicht schon mit 2 Schleifen?
B=(0:19);
E=rand(16,20);
[ma,na]=size(E);
C=(1:16);
E(1:16,na+1)=(C');
[me,ne]=size(E);
Tabelle=B;
Tabelle(2:me+1,ne-1)=0;
[mt,nt]=size(Tabelle);
hx=E(:,ne);
for f=E(:,1:ne-1)
for n=1:ne-1
grad=gradient(f,hx);
Tabelle(2:mt,n)=grad;
end
end
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:31 Mo 28.09.2009 | Autor: | LN- |
Hallo,
ja, n soll nur die Spalten zählen, es soll angefangen in Spalte 1 bis in diesem Beispiel Spalte 19 (in 20 steht nur der Abstandsparameter) jeweils eine Spalte weiter grad mit 16x1 eingefügt werden. Und zwar begonnen in der 2. Zeile, weil in der ersten ja bereits die Daten aus B stehen.
n soll keine Matrix sein, sondern nur angeben, dass in Spalte 1 bis eben in Spalte 19 jeweils nacheinander Einträge erfolgen sollen.
Ich habe es auch mit 2 Schleifen schon versucht, allerdings trägt er mir dann nur das zuletzt berechnete Ergebnis für grad in alle Spalten ein und ich möchte ja in jeder Spalte ein anderes Ergebnis stehen haben, nämlich das, das zu der jeweiligen Spalte in E gehört.
Irgendwie klappt es nicht, dass jeweils eine Spalte weitergesprungen wird. :-/ gibt es dafür evt. einen anderen Befehl?
Danke für die Hilfe, das ist echt super, ich steh voll auf dem Schlauch...
Gruß Ellen
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:57 Mo 28.09.2009 | Autor: | Frasier |
Ah, ich glaube ich verstehe.
Kannst du aus dem n nicht einfach einen Spaltenzähler machen:
B=(0:19);
E=rand(16,20);
[ma,na]=size(E);
C=(1:16);
E(1:16,na+1)=(C');
[me,ne]=size(E);
Tabelle=B;
Tabelle(2:me+1,ne-1)=0;
[mt,nt]=size(Tabelle);
hx=E(:,ne);
n=1;
for f=E(:,1:ne-1)
grad=gradient(f,hx);
Tabelle(2:mt,n)=grad;
n=n+1;
end
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:24 Mo 28.09.2009 | Autor: | LN- |
Hallo,
Wow, cool! Das klappt! Da war ich wohl einfach auf der falschen Fährte, ich dachte, ich muss das Ende von n definieren, aber ich glaube, dadurch dass das Ende von f schon definiert ist, ist auch das Ende von n gegeben...
Vielen, vielen Dank! Jetzt kann ich endlich weitermachen...
Gruß Ellen
|
|
|
|