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

Wertevergleich: Zeile rausschreiben funktioniert nicht

 

palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 11:36     Titel: Wertevergleich: Zeile rausschreiben funktioniert nicht
  Antworten mit Zitat      
Hallo

Die Werte von meinem vektor ee(:) sollen mit der Spalte h2r(k,:,8) verglichen werden. Wenn der Wert von ee(:) in h2r(k,:,8) gefunden wird, soll die Zeile von h2r in neu(k,df,2) gespeichert werden.

Hier mal mein Code:
Code:
for k=1:length(files);
      for df=1:5;
        for d=b(k)+1:bb(k);
               if ee(df)==h2r(k,d,8)
                  neu(k,df,2)=d;
               end
             
             
           % atempr=find(h2r(k,:,8)==ee(df));
          %  neu(k,df,2)=atempr;
             
        end
                                                         
     end
end
 


Der Code läuft zwar durch, aber er speichert die falschen Zahlen.

"find" funktionierte bisher auch nicht, weil es Werte in ee gibt, die in h2r nicht vorkommen. Dann kommt der Fehler "Empty matrix: 1-by-0".

Kann mir da wieder jemand helfen?


palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 11:38     Titel:
  Antworten mit Zitat      
Nochmal zum Verständnis. Mit "Zeile speichern", meine ich die Zeilennummer von h2r wo der Wert von ee vorkommt.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.07.2015, 11:48     Titel:
  Antworten mit Zitat      
es ist immer besser ein lauffähiges beispiel zu generieren. das kann man dann leichter nachvollziehen.
was ist wenn die werte nicht vorkommen? was soll dann passieren?
was meinst du mit flaschen werten? alle falsch? oder einige die du nicht erwartet hast? das musst du genauer ausführen wenn das beispiel nicht lauffähig ist.
man kann das auch ohne schleife einfach mit intersect machen.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 11:53     Titel:
  Antworten mit Zitat      
Danke für Deine Antwort.

Wenn Werte nicht vorkommen, dann soll Zeilennummer=Null rausgeschrieben werden.

falsche Zahl ist zum Beispiel einfach eine Null.

Ohne Schleife wäre ja mit find, aber dann kommt wie gesagt ein Fehler, weil er manche Werte nicht findet.

Folgender Code ist nochmal leicht modifiziert

Code:
for k=1:length(files);  
      for df=1:105;
        for  d=500:600;   % d=b(k)+1:bb(k);
               if ee(df)==h2r(k,d,8)
                  neu(k,df,2)=d;
               else
                   neu(k,df,2)=0;
               end
             
             
           % atempr=find(h2r(k,:,8)==ee(df));
          %  neu(k,df,2)=atempr;
             
        end
                                                         
     end
end


Ich versuche auch nochmal ein lauffähiges Beispiel zu basteln.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.07.2015, 12:02     Titel:
  Antworten mit Zitat      
Zitat:
Wenn Werte nicht vorkommen, dann soll Zeilennummer=Null rausgeschrieben werden.

falsche Zahl ist zum Beispiel einfach eine Null.

das siht für mich nicht einheitlich aus. setz den debugger an die stelle wo die 0 geschrieben wird und guck dir an was da passiert. wenn der platz lehr bleibt wird automatisch ne 0 eingefügt bei der vergrößerung des arrays. du solltest das eh vorher schonmal anlegen um rechenzeit zu spaaren. das was in deinem beispiel schnell geht geht bei großen datenmengen dann auch mal ganz schnell sehr langsam.
dein k fängt zb bei 500 an.. also hast du 499 lehre matritzen die unnötig speicher fressen. und wie ich bereits sagte kannst du auch einfach intersect benutzen
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 12:06     Titel:
  Antworten mit Zitat      
So hier mein lauffähiges Beispiels, welches hoffentlich mein Problem richtig abbildet...


Code:
clear all

ee=[-0.9;-0.8];

h2r(1,1,8)=0;
h2r(1,2,8)=0;
h2r(1,3,8)=-0.9;
h2r(1,4,8)=-0.8;

h2r(2,1,8)=-0.8;
h2r(2,2,8)=0;
h2r(2,3,8)=0;
h2r(2,4,8)=0;


for k=1:2; %Alle Zeillennummern wo dehnung gleich ist export RÜCKWEG
      for df=1:2;
        for  d=1:4;   % d=b(k)+1:bb(k);
               if ee(df)==h2r(k,d,8)
                  neu(k,df,2)=d;
               else
                   neu(k,df,2)=0;
               end
             
              %ERWARTUNG:
              %neu(1,1,2)=3
              %neu(1,2,2)=4  <- wird gefunden, andere nicht
              %neu(2,2,2)=1
              %Rest von neu(k,:,2)=0
               
               
           % atempr=find(h2r(k,:,8)==ee(df));
          %  neu(k,df,2)=atempr;
             
        end
                                                         
     end
end


Ich schaue mir gleich mal intersect an.
 
Palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 12:09     Titel:
  Antworten mit Zitat      
Ich glaube so klappt es jetzt.

Code:
clear all

ee=[-0.9;-0.8];

h2r(1,1,8)=0;
h2r(1,2,8)=0;
h2r(1,3,8)=-0.9;
h2r(1,4,8)=-0.8;

h2r(2,1,8)=-0.8;
h2r(2,2,8)=0;
h2r(2,3,8)=0;
h2r(2,4,8)=0;


for k=1:2; %Alle Zeillennummern wo dehnung gleich ist export RÜCKWEG
      for df=1:2;
        for  d=1:4;   % d=b(k)+1:bb(k);
               if ee(df)==h2r(k,d,8)
                  neu(k,df,2)=d;
              % else
               %    neu(k,df,2)=0;
               end
             
              %ERWARTUNG:
              %neu(1,1,2)=3
              %neu(1,2,2)=4  <- wird gefunden, andere nicht
              %neu(2,2,2)=1
              %Rest von neu(k,:,2)=0
               
               
           % atempr=find(h2r(k,:,8)==ee(df));
          %  neu(k,df,2)=atempr;
             
        end
                                                         
     end
end


Ich schau mal weiter, Danke schonmal.

Die Rechenzeit ist zwar nicht gering, aber noch aushaltbar :-x
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 14:01     Titel:
  Antworten mit Zitat      
Ich bins schon wieder.
So richtig zuverlässig funktioniert das leider doch nicht. Manchmal ja manchmal nein.

Beispiel wo es nicht funktioniert und zwar als Befehl eingegeben, nachdem der code durchgelaufen ist. Also quasi ein Test ob es funktioniert:

find(h2r(1,:,8)== ee(88)) liefert: Empty matrix: 1-by-0

ee(88) liefert: -0.8240

Bei find(h2r(1,:,8)== -0.8240), was ja eigentlich das gleiche ist, kommt aber die Ausgabe: 505

neur(1,88,2) müsste also 505 liefern, es kommt aber 0

Sehr mysteriös.

Die intersect Lösung verstehe ich leider nicht so recht, da erhalte ich ja keine Zeilennummer.

Jemand eine Idee?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.07.2015, 14:04     Titel:
  Antworten mit Zitat      
Hallo Palul,

Dies löscht unter anderen nützlichen Dingen auch alle Breakpoints und Einstellungen des Debuggers:
Code:

Deshalb ist das für ernsthaftes Programmieren sehr schädlich.

Gruß, Jan
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: 02.07.2015, 14:09     Titel:
  Antworten mit Zitat      
Zitat:
da erhalte ich ja keine Zeilennummer.

wie kommst du zu der Annahme ? intersect hat mehr als einen rückgabe parameter.
wenn dir etwas komisch vorkommt benutze den debugger wie ich bereits sagte.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 15:04     Titel:
  Antworten mit Zitat      
Vielen Dank wieder für Eure Antworten, aber ich komme leider immer noch nicht weiter.

intersect scheint mit meinen Variablen nicht zu funktionieren, da sie beide nicht als Matrix vorliegen.

intersect(h2r(k,:,8),ee,'rows')
Error using intersect>intersectR2012a (line 561)
Inputs A and B must be matrices with the same number of columns in the 'rows' case.

Error in intersect (line 135)
[varargout{1:nlhs}] = intersectR2012a(varargin{1:2},logical(flaginds(1:3)));

Wenn ich so einen Breakpoint setze passiert auch irgendwie nichts (das clear all ist jetzt weg). Ich habe leider keine großartige Ahnung von Matlab :-/
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 15:27     Titel:
  Antworten mit Zitat      
Ich habe noch mal geschaut warum
find(h2r(1,:,8)== ee(88)) : Empty matrix: 1-by-0
liefert, was ja eigentlich falsch ist, siehe den anderen Post.

Ich tendiere daher jetzt auf ein Genauigkeitsproblem zu sein. Also meine if Schleife scheitert womöglich, weil es vielleicht nicht ganz genau der gleiche Wert ist.
Die h2r(1,:,8) Werte sind nämlich gerundet worden. Auf die selbe Nachkommastelle wie ee(88) zwar, aber vielleicht ist das dann der Fehler.

Habt Ihr da noch einen Tipp? Entweder die gerundeten Werte von h2r(1,:,8) nochmal irgendwie neu generieren, oder die if schleife irgendwie mit einer Toleranz versehen.
 
palul

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 15:37     Titel:
  Antworten mit Zitat      
So ich habe es jetzt endlich!
Es war tatsächlich das Genauigkeitsproblem

mit ersetzen der if schleifenzeile durch:

if abs(h2r(k,d,8) - er(df)) < 0.0005

funktioniert es jetzt endlich
 
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.