WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Letzten Wert je Spalte einer Matrix in seperat speichern?

 

Sebbok
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 14.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2015, 21:59     Titel: Letzten Wert je Spalte einer Matrix in seperat speichern?
  Antworten mit Zitat      
Hallo liebe Matlab Gemeinde,
mein ergebnis einer ODE45 berechnung gibt mir eine matrix mit 4 spalten und n werten aus. wie kann ich aus jeder spalte den letzten wert auslesen ?

also x ist meine Matix weil die ode45 funktion 4 anfangswerte bekommt und die 4 anfangswerte in 4 Differentialgleichungen gelöst werden und die endwerte zurückgegeben.


Code:
x0=[D I DN IN];
 tspan=[0,20];
 
 [t,x] = ode45(@surclean2334,tspan,x0,[],[a,b,p,q]);


Code:
s1 = -x(1)*a+(1-x(1))*b;
          s2 = x(1)*a- b*(1-x(1));
          s3 = x(4)*q -p*x(2)*x(3);
          s4 = -x(4)*q +p*x(2)*x(3);
          drdt = [s1;s2;s3;s4];


dann kann ich
Code:
x(:,1) für die erste spalte x(:,2) für die 2te x(:,3) für die drite und x(:,4)
für die 4te nehmen aber wenn ich nun den endwert haben will und abspeichern will :

Code:
vektorA = x(:,4)(end);


gibt es eine fehlermeldung : cannot call or index into a temporary array?

Ich möchte dass in dem Vektor A in einer for schleife alle Endwerte von x(:,1) gespeichert werden für jeden meiner Durchläufe und in vektorB dann alle end werte von x(:,2) sodass ich am ende nur noch die endwerte von 100 durchläufen in 4 verschiedenen Vektoren habe.
Private Nachricht senden Benutzer-Profile anzeigen


kuchenbäcker
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 16:39     Titel:
  Antworten mit Zitat      
reicht nicht für den ersten Endwert

Code:

vektorA = x(end,1);
 


und für den zweiten

Code:

vektorA = x(end,2);
 


usw.?

dann kannst du doch mit

Code:

for i=1:4
vektorA(i)=x(end,i)
end
 


oder so ähnlich Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebbok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 14.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 18:54     Titel:
  Antworten mit Zitat      
Vielen Dank also das mit dem endwert nehmen passt schonmal aber jetzt habe ich das problem dass ich das ganze 100 mal für jeden durchlauf einer while schleife machen möchte und da hänge ich gerade etwas in der luft muss ich dann etwa noch eine for schleife in der while schleife einfügen oder kan ich das irgendwie kombinieren ?
Code:
while n > 1

 r = -0.375;
 v = 0.375;
 xz = (v-r).*rand(1)+r;
%
tt = -0.35;
vv = +0.35;
xx = (vv-tt).*rand(1)+tt;
%
rr = -0.1;
ss = 0.1;
st = (ss-rr).*rand(1)+rr;
%
zz = -0.2;
xr = 0.2;
xxs =(xr-zz).*rand(1)+zz;

a = 0.525 +xz ;%meana + xz;
b = 0.55 +xx;%meanb +xx;
p = 0.5 +st;%meanp +st;
q = 0.4 +xxs;% meanq +xxs;
 

 x0=[D I DN IN];
 tspan=[0,20];
 
 [t,x] = ode45(@surclean2334,tspan,x0,[],[a,b,p,q]);
 vektorA = x(end,1);
 vektorB = x(end,3);
 
%     plot(t,x(:,1),'r','linewidth',2)
%      hold on
%     plot(t,x(:,2),'g','linewidth',2)
%     hold on
%     plot(t,x(:,3),'b','linewidth',2)
%     hold on
%     plot(t,x(:,4),'k','linewidth',2)
%     hold on
%     grid on
    xlabel('days')
    ylabel('fractions of surfaces & nurses')
    M = max(x);
    N = min(x);
     fprintf('maxima %g',xz);
     fprintf('minima %g',N);
   
 
   n = n-1;
 end



Also im endeffect will ich in den VektorA und VektorB alle endwerte für jede der 100 durchläufe gespeichert haben im moment speichert er nur immer den wert des actuellen durchlaufs.

Vielen Dank Jungs und Mädels ihr seid echt spitze keep up the great work !
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.04.2015, 18:59     Titel:
  Antworten mit Zitat      
na dann musst du halt jeden wert speichern
Code:
vektorA(n-1) = x(end,1);

dadurch das deine schleife rückwärts läuft sorgst du sogar für eine präallokation im ersten druchlauf Smile das ist denke ich unbeabsichtigt aber richtig Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebbok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 14.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 19:19     Titel:
  Antworten mit Zitat      
Ich habs grade bemerkt habs gerade getestet und funktioniert aber danke für die schnelle Hilfe Smile manchmal hilft das Matlab help command dann doch. okay Ich habs fast jetzt speichert er die 100 Werte alle in einem Zeilenvektor soweit so Gut und die Verteilung wird auch angezeigt. Jedoch bin ich mir nicht ganz sicher ob das stimmt bzw es wird immer ein event bei 0% angezeigt was eigtl nicht sein kann. Kann sich das mal jemand anschauen ? code einfach in matlab und run das sollte klappen. Wär cool wenn sich das mal jemand kurz anschaut.

Code:
function [t,N,D,I] = SImulationhospital % junk function to run it without 2 files


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear variable;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Surfaces
N = 10000;          % numbers of surfaces
d =  9800;
i = 200;            % contaminated surfaces


D = d/N;
I = i/N;


% clean surfaces
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%nurses
NN = 825;                  % number Nurses
in = 325;               % contaminated nurses
dn = 500;                % decontaminated nurses

IN = in/NN;
DN = dn/NN;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 n = 1001;
 
%vektorA = zeros(1,n);
%vektorB = zeros(1,n);

 while n > 1

 r = -0.375;
 v = 0.375;
 xz = (v-r).*rand(1)+r;
%
tt = -0.35;
vv = +0.35;
xx = (vv-tt).*rand(1)+tt;
%
rr = -0.1;
ss = 0.1;
st = (ss-rr).*rand(1)+rr;
%
zz = -0.2;
xr = 0.2;
xxs =(xr-zz).*rand(1)+zz;

a = 0.525 +xz ;%meana + xz;
b = 0.55 +xx;%meanb +xx;
p = 0.5 +st;%meanp +st;
q = 0.4 +xxs;% meanq +xxs;
 

 x0=[D I DN IN];
 tspan=[0,20];
 
 [t,x] = ode45(@surclean2334,tspan,x0,[],[a,b,p,q]);
 vektorA(n-1) = x(end,1);
 vektorB(n-1) = x(end,3);
 
%     plot(t,x(:,1),'r','linewidth',2)
%      hold on
%     plot(t,x(:,2),'g','linewidth',2)
%     hold on
%     plot(t,x(:,3),'b','linewidth',2)
%     hold on
%     plot(t,x(:,4),'k','linewidth',2)
%     hold on
%     grid on
    xlabel('days')
    ylabel('fractions of surfaces & nurses')
    M = max(x);
    N = min(x);
%      fprintf('maxima %g',xz);
%      fprintf('minima %g',N);
   
 
   n = n-1;
 end
%  h = x(:,1);
%  r = h(end);
 hist (vektorA,100)
 hist (vektorB,100)
 legend ('surfaces clean','surfaces cont','clean nurses ','cont nurses');
 %legend ('boxoff');
 
 function drdt = surclean2334( ~,x,val )
%UNTITLED3 Summary of this function goes here
%D=x1  
%I=x2
%DN=x3
%IN=x4
%Nmax= 200;

a=val(1);
b=val(2);
p=val(3);
q=val(4);

if (a <= 0)
    a= 0;
else
    a=a;
end

if (b <= 0)
    b= 0;
else
    b=b;
end

if (p <= 0)
    p=0;
else
    p=p;
end
if (q <= 0)
    q=0;
else
    q=q;
end
          s(1) = -x(1)*a+(1-x(1))*b;
          s(2) = x(1)*a- b*(1-x(1));
          s(3) = x(4)*q -p*x(2)*x(3);
          s(4) = -x(4)*q +p*x(2)*x(3);
          drdt = [s(1);s(2);s(3);s(4)];
               
end
end
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.