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

Zeilenvektoreinträge Partitionieren

 

toenchen
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 19.03.11
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 11.07.2011, 12:09     Titel: Zeilenvektoreinträge Partitionieren
  Antworten mit Zitat      
Hey liebe matlaber,

ich versuche es heute nochmal, weil ich immernoch am grübeln bin und die arbeit nur weiter vor mir herschiebe... es geht hauptsächlich um matrizen und vektoren

Code:


A = [1,2,2,1,1;0,0,0,0,0;0,0,0,0,0;0,0,0,0,0;0,0,0,0,0];

% ich lasse mir von der matrix A, die vorinitialisiert ist mit nullen, nur
% die erste Zeile errechnen und direkt schon jetzt sollen die einträge
% unterteilt werden:

Fi = [];                %hier soll der eintrag A(i) stehen, wo eine 1 vorkommt
Pi = [];                %hier wo eine 2 vorkommt

for i = 1:size(A,2)
    if A(i)==1
        Fi(i)=(i);
    elseif A(i)==2
        Pi(i)=(i);
    end
end

% das hier klappt aber nicht so richtig, als ergebnis bekomme ich hier nur in Fi
% eine 1 und Pi ist leer
% Warum?
% sollte es klappen und Fi = [1,4,5], dann möchte ich die matrix A an der
% stelle A(2,3) auch mit einer 1 befüllen
% bei Pi = [2,3] möchte ich folgendermaßen weiterarbeiten, A(1,2)=2
% und A(1,4)= 1 => A(2,4)=2 und natürlich A(1,3)=2 und A(1,4)=1 => A(3,4)=2
% und das ganze auch mit A(3,4) und A(3,5)...


Ich wäre sehr dankbar, wenn mir jemand meine blindheit warum das mit dem partitionieren in Fi und Pi nicht funktioniert nimmt.... Ich bin zwar blutiger anfänger, aber dass ich selbst das nicht auf die reihe kriege war mir nicht bewusst. tut mir leid, wenn die frage für euch etwas dumm rüber kommt. Ich hatte schon einmal eine antwort bekommen auf die frage, wo jmd den vorschlag gemacht hat mit unique values zu arbeiten, aber das ist nicht sinn der sache, es soll schon um die konkreten einträge gehen, um dann damit die obere dreiecksmatrix im vorfeld zu befüllen und sich das errechnen an diesen stellen zu ersparen. es geht nämlich um eine laufzeitverbesserung, des zugrundeliegenden algorithmus, der A berechnet...

Vielen lieben tausend dank, für jede antwort!
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: 11.07.2011, 12:51     Titel: Re: Zeilenvektoreinträge Partitionieren
  Antworten mit Zitat      
Hallo toenchen,

Code:
A = [1,2,2,1,1;0,0,0,0,0;0,0,0,0,0;0,0,0,0,0;0,0,0,0,0];
for i = 1:size(A,2)
    if A(i)==1
        Fi(i)=(i);
    elseif A(i)==2
        Pi(i)=(i);
    end
end

Dies testet die Werte von A(1) bis A(5). Da Matlab Arrays spalten-orientiert speichert, entspricht das A(1,1) bis A(5,1). Unter diesen Werten befindet sich keine 2.

Zitat:
% sollte es klappen und Fi = [1,4,5], dann möchte ich die matrix A an der
% stelle A(2,3) auch mit einer 1 befüllen
% bei Pi = [2,3] möchte ich folgendermaßen weiterarbeiten, A(1,2)=2
% und A(1,4)= 1 => A(2,4)=2 und natürlich A(1,3)=2 und A(1,4)=1 => A(3,4)=2
% und das ganze auch mit A(3,4) und A(3,5)...

Das verstehe ich überhaupt nicht. Wieso soll A(2,3) auf 1 gesetzt werden, wenn Fi gleich [1,4,5] ist?

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: 11.07.2011, 16:57     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für den Tipp erstmal, nun funktioniert es, wenn ich einfach angebe A(1,i). Das ist schonmal prima.

Jetzt zu dem weiterarbeiten... Dem ganzen liegt ein programm zugrunde, dass chemische reaktionen miteinander vergleicht und beziehungen zwischen diesen angibt. in der matrix A stehen in den zeilen und in den spalten alle vorhandenen reaktionen und die einträge 1 bis 5 (ich hab hier einfachheitshalber nur 1 und 2 angegeben) deuten auf die beziehung, der jeweiligen reaktionen i und j zueinander, hin.

Wenn bspw. die Reationen A(1,4) und A(1,5) den beziehungstyp 1 Fi = [1,4,5] haben, kann ich daraus schließen, dass die Reaktionen 4 und 5 A(4,5) auch den beziehungstyp 1 haben, also dort in die matrix schonmal eine 1 eintragen. Dem ganzen liegt eine Tabelle zugrunde, die ich hier mal aufführen kann:

A(1,2) = 1 und A(1,3) = 1 --> A(2,3) = 1
A(1,2) = 1 und A(1,3) = 2 --> A(2,3) = 2 [der umgekehrte fall gillt auch]
A(1,2) = 1 und A(1,3) = 3 --> A(2,3) = 3
A(1,2) = 1 und A(1,3) = 4 --> A(2,3) = 4
A(1,2) = 1 und A(1,3) = 5 --> A(2,3) = 5

A(1,2) = 2 und A(1,3) = 2 --> A(2,3) = kann keine aussage treffen
A(1,2) = 2 und A(1,3) = 3 --> A(2,3) = 3
A(1,2) = 2 und A(1,3) = 4 --> A(2,3) = 4
A(1,2) = 2 und A(1,3) = 5 --> A(2,3) = 5

A(1,2) = 3 und A(1,3) = 1 --> A(2,3) = 4
A(1,2) = 3 und A(1,3) = 2 --> A(2,3) = 4
A(1,2) = 3 und A(1,3) = 3 --> A(2,3) = keine aussage
A(1,2) = 3 und A(1,3) = 4 --> A(2,3) = 4
A(1,2) = 3 und A(1,3) = 5 --> A(2,3) = keine aussage

A(1,2) = 4 und A(1,3) = 1 --> A(2,3) = 3
A(1,2) = 4 und A(1,3) = 2 --> A(2,3) = 3
A(1,2) = 4 und A(1,3) = 3 --> A(2,3) = 3
A(1,2) = 4 und A(1,3) = 4 --> A(2,3) = keine aussage
A(1,2) = 4 und A(1,3) = 5 --> A(2,3) = keine aussage

A(1,2) = 5 und A(1,3) = 1 --> A(2,3) = 5
A(1,2) = 5 und A(1,3) = 2 --> A(2,3) = 5
A(1,2) = 5 und A(1,3) = 3 --> A(2,3) = 5
A(1,2) = 5 und A(1,3) = 4 --> A(2,3) = keine aussage
A(1,2) = 5 und A(1,3) = 5 --> A(2,3) = keine aussage

Vllt verstehst du jetzt was ich meine und hast eine idee daszu? das wäre mir eine SEHR SEHR große hilfe! Ich kann aber auch verstehen, da das jetzt wirklich sehr kompliziert wirkt und es länger dauert sich da einzufuchsen, wenn das zu viel mühe und arbeit ist... dann muss ich mir nachhilfe oder so suchen... Smile

Ganz liebe 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: 12.07.2011, 02:44     Titel:
  Antworten mit Zitat      
Hallo toenchen,

Wenn ich das richtig verstehe sieht die Tabelle also so aus:
Code:

Table = [1, 2, 3, 4, 5; ...
            NaN, NaN, 3, 4, 5; ...
            4, 4, NaN, 4, NaN; ...
            3, 3, 3, NaN, NaN; ...
            5, 5, 5, NaN, NaN];
A(2, 3) = Table(A(1, 2), A(1, 3));

Wie geht's nun weiter?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 12.07.2011, 09:09     Titel:
  Antworten mit Zitat      
Hi,

wie wäre es wenn du es für das erste Teil deiner Aufgabe mit find versuchst:
Code:


Fi = find(A==1);

Pi = find(A==2);


 


dieses mit dem befüllen habe ich noch nicht ganz verstanden...

Gruß,

lilov
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: 13.07.2011, 14:02     Titel:
  Antworten mit Zitat      
Hey,

vielen Dank für eure Antworten, ich hab das problem bereits gelöst und es auch geschafft, alles zu befüllen, war etwas kompliziert zu erklären...

Nun hab ich aber noch eine kleine frage, da ihr so nett seid schreib ich das gleich mal hier rein.

Es geht ja um eine laufzeitverbesserung bei dem programm und ich bekomme als ausgabe immer diese tabelle und ich lass mir die zeit in sekunden mit

t1=cputime
code
t2=cputime
t2-t1

ich möchte jetzt aber gern das ganze 10 mal laufen lassen, dann meinen verbesserten algorithmus 10 mal laufen lassen und am ende die zeiten vergleichen...

geht das und wenn ja wie? bisher hab ich mir immer die zeiten aufgeschrieben mit stift und papier und dann einen mittelwert daraus errechnet, aber da gibt es doch sicher eine einfachere möglichkeit, bei der ich weniger schreiben und in den rechner tippen muss oder? Wink

vielen dank schonmal im voraus!
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 15:26     Titel:
  Antworten mit Zitat      
Code:

tic
for i=1:10
   %code des alten algorithmus
end
toc
tic
for i=1:10
   %code des alten algorithmus
end
toc


 
 
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.