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

strfind fehler

 

Thorsten563

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2013, 21:54     Titel: strfind fehler
  Antworten mit Zitat      
hallo gomatlab,

ich probiere gerade ein COde was ich hier im FOrum gefunden habe. Nur leider bekomme ich eine Fehlermeldung.

Im Forum Vorschlag war der Input statisch, jedoch wollte ich mit einem zufällig generierten array ausprobieren rand(1000000,1).


Folgende Fehlermeldung wird ausgegeben

Code:
Dimensions of matrices being concatenated are not consistent.

Error in example (line 3)
 T2 = strfind([false, diff(A) == 0, false], [false, true(1, 5), false]);



Viele Grüße,,
Thorsten


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 27.03.2013, 22:53     Titel:
  Antworten mit Zitat      
Keine Ahnung auf welchen Code-Snip aus dem Forum du dich beziehst. Ich kann damit nicht so viel anfangen. Es wäre besser wenn du deinen gesamten Code posten würdest.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.03.2013, 22:53     Titel:
  Antworten mit Zitat      
Hallo,

der Code geht davon aus, dass A ein Zeilenvektor ist.
Wenn A ein Spaltenvektor ist, muss entweder A transponiert werden oder ; als Trennzeichen beim Erstellen der Vektoren verwendet werden.

Grüße,
Harald
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.03.2013, 00:21     Titel: Re: strfind fehler
  Antworten mit Zitat      
Hallo Thorsten,

Matlab's Fehlermeldung habe eine sehr hohe Qualität. Hier bekommst Du:
Code:
Dimensions of matrices being concatenated are not consistent.

Das weist schonmal stark darauf hin, dass das Problem nicht mit STRFIND zu tun hat, sondern mit dem Zusammenfügen der Arrays.
Mit diesem Wissen kann man nun den Befehl in einzelne Teile auseinandernehmen:
Code:
A = [false, diff(A) == 0, false];
B = [false, true(1, 5), false];
T2 = strfind(A, B);

Wenn man dies laufen lässt, scheitert es schon bei der Zuweisung von A. Wie bereits erklärt, kann man nicht Arrays der Größen [1x1], [999999 x 1] und [1x1] horizontal zusammenfügen, da dies keine rechteckige Matrix mehr geben kann.

So kann man also Fehlern auf den Grund gehen:
1. Zeile finden, die scheitert,
2. In Einzel-Teile zerlegen so weit es geht,
3. Nochmal versuchen, welcher Teil den Fehler erzeugt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2013, 19:28     Titel:
  Antworten mit Zitat      
wie könnte man den code erweitern, um damit das matching von dem pattern flexibel zu halten..

in unserem fall sind es genau 5...
jedoch möchte ich die angabe als mindestens sehen


ich möchte die markierung solange halten bis sich die differenz ändert
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.03.2013, 20:06     Titel:
  Antworten mit Zitat      
Hallo,

Dann brauchst Du einen Run-Length-Encoder. Hier findest Du einiges im FileExchange. Ich werde nächste Woche ein schnelle C-Mex-Funktion dort veröffentlichen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2013, 21:57     Titel:
  Antworten mit Zitat      
Danke, aber das hört sich kompliziert an.. Ich würde gerne einfaches kleines Code schreiben, dass das abfängt. Muss jetzt nicht 100 prozent abfangen können.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.04.2013, 12:47     Titel:
  Antworten mit Zitat      
Hallo,
Ob sich das "kompliziert anhört" oder nicht, spielt keine so große Rolle, oder? Du brauchst ein Programm, das so kompliziert ist, wie es der Komplexitätsgrad Deines Problems erfodert. Eine Lösung, die nicht 100% der Fälle abfängt, ist im dem Maße wertlos, wie Du nicht genau definieren kannst, auf welche Prozente Du verzichten möchtest.

Im FileExchange suchen und ein vorhandenes Tool herunterzuladen ist ebenfalls nicht kompliziert. Vor allem hätte dies den Vorteil, dass Du das Problem in Eigeninitiative löst, statt die Leute im Forum die Arbeit erledigen zu lassen. Du schreibst zwar "ich möchte gerne einen kleinen Code schreiben", aber irgendwie hört sich die Mitteilung so an, als wollest Du, dass wir das für Dich schreiben.

Also hier noch mal ein Run-Length-Encoder:
Code:
d = [true; diff(x) ~= 0];   % TRUE if values change
b = x(d);                   % Elements without repetitions
k = find([d', true]);       % Changes of values
runlength = diff(k);                % Number of repetitions
index = k(1:length(k) - 1);  % Index of sequences

Wenn Du nun alle Lauf-Längen >= 5 haben möchtest, bekommst Du das mit:
Code:
match = (runlength >= 5);

Und die dazugehörigen Anfangs-Indices sind "index(match)".

Viel Erfolg beim Erweitern des Codes, bis er Dein Problem genau löst!
Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2013, 15:12     Titel:
  Antworten mit Zitat      
Danke schön, dass ist doch schon mal der anfang,
jetzt würde ich eigentlich zunächst einmal die mindestlänge von fünf suchen, sobald ich sowas finde, würde ich in einer schleife die nächsten punkte berechnen, also jedesmal mit dem vorherigen abziehen, sobald es gleich ist, heisst es gehört auch zum cluster. Bei veränderung könnte ich sagen, dass die marlkierung aufhört...

das wäre doch eine mögliche lösung oder?
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2013, 13:28     Titel:
  Antworten mit Zitat      
Code:
A = [false, diff(A) == 0, false];
B = [false, true(1, 5), false];
T2 = strfind(A, B);
 


rein von der theorie her, was passiert, wenn ich 11 werte hintereinander gereiht bekomme...


beispielsweise:

1 2 3 4 4 4 4 4 4 4 4 4 4 4 3 1
bekomme ich dann folgendes in mein T2
0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0
oder
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 08.04.2013, 16:25     Titel:
  Antworten mit Zitat      
?hast du kein Matlab?
probiers aus! tipp: octave ist halbwegs kompatibel mit vielen Matlabbefehlen und kostenlos.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 08.04.2013, 16:43     Titel:
  Antworten mit Zitat      
Hallo,
Zitat:
jetzt würde ich eigentlich zunächst einmal die mindestlänge von fünf suchen, sobald ich sowas finde, würde ich in einer schleife die nächsten punkte berechnen, also jedesmal mit dem vorherigen abziehen, sobald es gleich ist, heisst es gehört auch zum cluster. Bei veränderung könnte ich sagen, dass die marlkierung aufhört...

Ich kann Dir nicht folgen. Mein Code erzeugt den Logical Vektor "match", der für alle Blöcke gleicher Werte TRUE ist, wenn sie >= 5 Elemente haben. Der Vektor "runlength" enthält doie Länger der Blocke. Dann ist "cumsum([1 + runlength])" der Startwert der einzelnen Blöcke. Wonach willst Du dann in den daten noch suchen? Es ist doch alles gewünschte schon vorhanden?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2013, 21:53     Titel:
  Antworten mit Zitat      
Ich versuche die geunden stelle mit dem code zun#ächst einmal farblich darzustellen bei dem plotten
Code:
A = [false, diff(A) == 0, false];
B = [false, true(1, 5), false];
T2 = strfind(A, B);



diesen lösungsansatz habe ich noch nicht verwendet, muss es noch verstehen

Code:
d = [true; diff(x) ~= 0];   % TRUE if values change
b = x(d);                   % Elements without repetitions
k = find([d', true]);       % Changes of values
runlength = diff(k);                % Number of repetitions
index = k(1:length(k) - 1);  % Index of sequences
 
 
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.