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

Länge des Vectors ändert sich nach filtern?

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 27.09.2014, 22:11     Titel: Länge des Vectors ändert sich nach filtern?
  Antworten mit Zitat      
Hallo liebe Kollegen,

ich bin ein bisschen werwirrt. Bei der Ausführung von folgenden Zeilen bekomme ich die Ergebnisse wie die angehängte Bilder zeigen

Code:

reshuffleDateListSingle = cellfun(@(date, reshuffle) ismember(date, reshuffle), dateVector, shuffleHelper2, 'UniformOutput', false);
idx = find(cellfun(@(x) any(x==1), reshuffleDateListSingle)==1);
 


Was ich bei

Code:
reshuffleDateListSingle(idx)


bekomme, sieht ihr im Bild (incorrectResult).

Bei

Code:
reshuffleDateListSingle([1 5 10 12 15])


bekomme ich das richtige Ergebniss (correctResult)

Wie kann es sein das sich beim filtern ändert die Größe des Vectors? Ich verstehe es nicht Sad

Danke!

LG
Joekey

incorrectResult.png
 Beschreibung:

Download
 Dateiname:  incorrectResult.png
 Dateigröße:  6.92 KB
 Heruntergeladen:  309 mal
correctResult.png
 Beschreibung:

Download
 Dateiname:  correctResult.png
 Dateigröße:  2.91 KB
 Heruntergeladen:  320 mal
idx.jpg
 Beschreibung:

Download
 Dateiname:  idx.jpg
 Dateigröße:  20.49 KB
 Heruntergeladen:  328 mal
reshuffleDateListSingle.jpg
 Beschreibung:

Download
 Dateiname:  reshuffleDateListSingle.jpg
 Dateigröße:  44.01 KB
 Heruntergeladen:  327 mal
Private Nachricht senden Benutzer-Profile anzeigen


joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 28.09.2014, 11:24     Titel:
  Antworten mit Zitat      
Hallo nochmal Smile

ich habe ein Beispiel mit Originaldaten vorbereitet (Beispieldaten sind angehängt):

Code:
% load example data
load('example.mat');

% filter by idx array - returns cell array with changed size (NOK!)
data(idx)

% data(idx)
% ans =
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [552x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]
%     [554x1 logical]

% filter by explizit index - returns cell array with original size (OK)
data(1:20)

% data(1:20)
% ans =
%     [409x1 logical]
%     [379x1 logical]
%     [410x1 logical]
%     [157x1 logical]
%     [127x1 logical]
%     [316x1 logical]
%     [180x1 logical]
%     [396x1 logical]
%     [194x1 logical]
%     [511x1 logical]
%     [145x1 logical]
%     [312x1 logical]
%     [399x1 logical]
%     [554x1 logical]
%     [497x1 logical]
%     [ 73x1 logical]
%     [554x1 logical]
%     [293x1 logical]
%     [ 47x1 logical]
%     [404x1 logical]


Wie ist es möglich dass diese zwei Vorgehensweisen unterschiedliche Ergebnisse liefern? Wa mache ich falsch?

Danke!

LG
Joekey

example.rar
 Beschreibung:

Download
 Dateiname:  example.rar
 Dateigröße:  27.82 KB
 Heruntergeladen:  377 mal
exampleTest.m
 Beschreibung:

Download
 Dateiname:  exampleTest.m
 Dateigröße:  96 Bytes
 Heruntergeladen:  338 mal
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: 01.10.2014, 23:41     Titel:
  Antworten mit Zitat      
Hallo joekey,

Ich verstehe die Frage immer noch nicht.
Offenbar ist der Inhalt von "idx" nicht 1:20 , worüber wunderst Du Dich dann?
Was würdest Du denn erwarten?

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.10.2014, 10:46     Titel:
  Antworten mit Zitat      
Hallo Jan,

es geht nicht um die variable data selbs, sonder um die Zellen die in data enthalten sind. Nach dem filtern hat sich die Größe der Zellen von 554 in

[409x1 logical] [379x1 logical] [410x1 logical] [157x1 logical] ...

geändert.

Danke!

LG joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 03.10.2014, 11:58     Titel:
  Antworten mit Zitat      
So lange du nicht erklärst was idx ist, kann man dir wohl nicht weiterhelfen.

Jan bringt es doch schon auf den Punkt...

Jan S hat Folgendes geschrieben:

Offenbar ist der Inhalt von "idx" nicht 1:20 , worüber wunderst Du Dich dann?
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: 03.10.2014, 18:12     Titel:
  Antworten mit Zitat      
Hallo joekey,

Ist es inzwischen klar?

Code:
data(idx(1))  %     [554x1 logical]
data(1)         %     [409x1 logical]

idx(1) ist halt nicht 1, also ist "data(idx(1)" einfach ein anderes Cell-Element als "data(1)".

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.10.2014, 20:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

es ist leider nicht klar, weil das Problem noch nicht erkannt wurde:

1) Vector data hat beim ausgangspunkt Zellarray die alle gleiche Länge haben (in meinem Beispiel 544x1])
2) Ich kann dieses Ausgangsvector (1) filtern:
a) entwder direkt duch eingabe von Vector: data(1:20) (die Wahl des Vectorgröße hat mit dem Ergebniss nicht direkt zu tun. Es ist nur ein beispiel für eine direkte Eingabe von index. Ohne ein anderes Index über Variable zu referenzieren).
b) oder ich referenziere auf Index dass in einer anderen Variable gespeichert ist.
3) da ausgangsdaten alle gleiche Länge haben, sollte es meiner meinung nach egal sein, mit welcher Methode (a/b) ich die Elemente auswähle, Ergebniss = die länge des Vectors in jeweiliger Zelle sollte gleich mit dem der Ausgangsdaten sein, oder? Ich filtere ja nur die Zellen aus, und ändere nicht deren Inhalt.

Hoffe ich habe jetzt mehr Klarheit zu meinem Problem geschaffen.

Danke noch mal für Hilfe!

LG
Joekey
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: 09.10.2014, 18:15     Titel:
  Antworten mit Zitat      
Hallo joekey,

Ich glaube, Du stehst auf dem Schlauch.

Zitat:
1) Vector data hat beim ausgangspunkt Zellarray die alle gleiche Länge haben (in meinem Beispiel 544x1])

Die Beispiel-Daten, die Du gezeigt und gepostet hast haben aber eben nicht alle die gleiche Dimension [544 x 1].
Weshalb gehst Du davon aus, dass alle Cell-Elemente die gleiche Dimension haben? Matlab zeigt Dir doch eindeutig, dass es nicht so ist.
Das von Dir geposteten Beispiel-Code macht mit den Daten genau das, was zu erwarten ist. Die extrahierten Cell-Elemente habe exakt die gleiche Größe, die sie auch im Cell-Array haben. Ich sehe also nach wie vor kein Problem.

Probiere es doch mal explizit aus:
Code:
s1 = cellfun('size', data, 1);
length(s1)
length(unique(s1))

x1 = data(1:20);
index = 1:20;
x2 = data(index);
isequal(x1, x2)

Es spielt in Matlab keine Rolle, ob man den Index direkt angibt oder in einer Variablen speichert. Wenn hier in Deinem Programm etwas anderes geschieht, gibt es an einer andere Stelle einen Befehl, der etwas von Dir unerwartetes verändert.

Vielleicht überschreibst Du den Inhalt von idx irgendwo - tückisch sind da die Verwendung von Skripten statt Funktionen und "Fernmanipulationen" per EVALIN und ASSIGNIN.

Oder idx ist nicht als Variable definiert (Tippfehler beim Namen?), sondern eine Funktion und deren Resultat ist unerwartet, aber korrekt.

Gefährlich ist es auch LOAD ohne Rückgabe-Parameter zu verwenden und so direkt in den Workspace zu schreiben. Wenn man übersieht, dass das MAT-File dann noch mehr Variablen enthält, kann man schnell Bugs produzieren. Besser ist es also immer die eingelesenen Werte in einem Struct zu speichern mit "Data=load()".

Gruß, Jan
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.