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

Laufzeitverbesserung, anfänger

 

toenchen
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 19.03.11
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.07.2011, 22:02     Titel: Laufzeitverbesserung, anfänger
  Antworten mit Zitat      
Hallo liebe leute, ich hab eine funktion geschrieben, die das zugrundeliegende programm etwas schneller machen sollte...
Code:

 s=size(network.stoichiometricMatrix);
    fctable=zeros(s(2),s(2));

    Fi=zeros(s(2),s(2));
    Pi=zeros(s(2),s(2));
    Di=zeros(s(2),s(2));
    di=zeros(s(2),s(2));
    Ui=zeros(s(2),s(2));



    for i=1:s(2)

        for j=i+1:s(2)

                if fctable(i,j)== 0
                    fctable(i,j)=pairwiseCouplingFFCA(solver,network, i, j, Irev, Prev, Frev);
                if (fctable(i, j)==8)
                    fctable(i,j)=pairwiseCouplingBwoS(solver,network, i, j);
                end

Nun will ich die werte, die durch pairwiseCouplingFFCA & -BwoS erzeugt werden in fünf kleinere Teile unterteilen, also die Matrizen Fi, Pi, Di, di, Ui

                if fctable(i,j)==1
                     Fi(i,j)=true;
                elseif fctable(i,j)==5
                     Ui(i,j)=true;
                elseif fctable(i,j)==2
                    Pi(i,j)=true;
                elseif fctable(i,j)==3
                    Di(i,j)=true;
                else di(i,j)=true;
                end

Und nun kann ich vorhersagen treffen, bevor mit den functionen von oben weitergearbeitet werden muss. diese sind nämlich sehr langsam und müssen jedesmal viele lineare programme lösen, daher ist die idee, diese vielen verschiedene cases die eintreffen können einmal durchzuprüfen und schonmal in die matrix (fctable) einzutragen, damit an den stellen, kein lineares programm gelöst werden muss: Das hab ich so gelöst:


                for l = 1:s(2)
                    for k = 1:s(2)
                        if Fi(i,l)== true && Ui(i,k) == true
                            fctable(l,k)=5;
                        elseif Fi(i,l)== true && Fi(i,k) == true
                            fctable(l,k)=1;
                        elseif Fi(i,l)== true && Pi(i,k) == true
                            fctable(l,k)=2;
                        elseif Fi(i,l)== true && Di(i,k) == true
                            fctable(l,k)=3;
                        elseif Fi(i,l)== true && di(i,k) == true
                            fctable(l,k)=4;
                        elseif Pi(i,l)== true && Di(i,k) == true
                            fctable(l,k)=3;
                        elseif Pi(i,l)== true && di(i,k) == true
                            fctable(l,k)=4;
                        elseif Pi(i,l)== true && Ui(i,k) == true
                            fctable(l,k)=5;
                        elseif Di(i,l)== true && di(i,k) == true
                            fctable(l,k)=4;
                        end


Das programm funktioniert auch so und gibt die gleichen ergebnisse wie vorher, nur ... naja, nicht schneller sondern langsamer...

Das liegt zum teil auch daran, dass ich jetzt ein paar fälle weggelassen habe, die nicht eindeutig sind, sondern für die dann nochmal extra eine der pairwiseCoupling-funktionen aufgerufen werden muss.

Meine Frage ist nun eigentlich: Gibt es nicht eine schönere und vorallem einfachere variante, das ist jetzt so anfängermäßig alle fälle einmal durchprobiert, aber geht nicht auch irgendwie etwas in die richtung:

Code:

fctable(Fi,Fi)= ones...
fctable(Fi, Pi)= 2*ones...
fctable(Fi, Di)= 3*ones...
fctable(Fi, di)= 4*ones...
 

irgendwie so, das man nicht alle cases durchgehen muss und tausend und eine if abfrage hat??? ich hoffe das ist hier nicht zu unübersichtlich und unverständlich, da es nur so ein ausschnitt von der funktion ist... naja, ich wäre jedenfalls für jeden tipp, sehr sehr dankbar! Smile

viele grüße, toenchen
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.07.2011, 00:44     Titel:
  Antworten mit Zitat      
Hallo toenchen,

Ich habe das Problem nicht ganz verstanden. Aber rein technisch läßt sich der IF-Baum so verkürzen:
Code:

s2 = s(2);
for l = 1:s2
  for k = 1:s2
     if Fi(i,l)
        if Ui(i,k)
           fctable(l,k)=5;
        elseif Fi(i,k)
           fctable(l,k)=1;
        elseif Pi(i,k)
           fctable(l,k)=2;
        elseif Di(i,k)
           fctable(l,k)=3;
        elseif di(i,k)
           fctable(l,k)=4;
        end
     end
     if Pi(i,l)
        if Di(i,k)
           fctable(l,k)=3;
        elseif di(i,k)
           fctable(l,k)=4;
        elseif Ui(i,k)
           fctable(l,k)=5;
        end
     end
     if Di(i,l) && di(i,k)
        fctable(l,k)=4;
     end
  end
end

Leider muss das nicht unbedingt das gleiche Ergebnis liefern, wenn z.B. Fi(i,l) und Pi(i,l) beide TRUE sind. Auf jeden Fall kann man sich die Vergleiche mit TRUE sparen. Kann man den Fall di(i,k) => fctable(l,k)=4 zu beginn ausschließen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
toenchen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 19.03.11
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 28.07.2011, 15:05     Titel:
  Antworten mit Zitat      
Hey,

na das sieht ja schonmal tausendmal besser aus, vielen dank. Was meinst du mit dem Fall d(i,k) ==> fctable(l,k)=4?

Also diese vorhersagen basieren auf einer tabelle, und diese is symmetrisch, deswegen muss ich nur die abfrage für die fälle:

Fi mit allen,
Pi mit Pi-Ui,
Di mit di und Ui (weil wenn beide Di sind, kann man nix aussagen)
Und ja, für die Fälle di&&di , di&&Ui kann man auch keine vorhersagen treffen, wenn du das meinst Smile

also gut ich bring diese verkürzung mal ein, muss mir das nochmal anschauen und gucken ob es die gleichen ergebnisse erzielt! Vielen dank erstmal!

ich habe bestimmt später noch mehr fragen Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
toenchen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 19.03.11
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 28.07.2011, 19:00     Titel:
  Antworten mit Zitat      
Und hier ist sie direkt: Very Happy

Ich soll zunächst von einer matrix den nullSpace erzeugen, mit matlab ja sehr einfach:

K = null(Matrix, 'r') <-- rational reicht bei mir

Jetzt soll ich aber zeilenvektoren i,j finden, die folgendes erfüllen:

K( i, : ) = x* K( j, : )

sprich vektoren, die linear abhängig sind. Da gibt es doch bestimmt in matlab auch wieder eine tolle funktion? Oder muss ich durch die beiden zeilen durchgehen und die einträge jeweils teil und wenn sie gleich sind und der teiler in der ganzen zeile gleich bleibt, mir i,j merken?

ich hab es auch schon mit gcd probiert, aber da kann man ja nur zwei zahlen vergleichen oder?

bitte bitte eine kleine hilfestellung, ich bin einfach nicht dafür gemacht Smile vielen lieben dank

lg toenchen
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.