2017-09-18 1 views
0

Ich habe eine Matrix, die in einer .mat Datei gespeichert wurde, und wurde dann in Matlab über die Funktion neu geladen. Ich habe auch einen logischen Index, wie logische ([1 0 1 0]), dass ich auf das geladene Matrix anwenden möchten:Logische Indizierung fehlgeschlagen, wenn Matrix von Matfile geladen wird

results = matfile('results.mat'); 
% id is my logical vector of the appropriate size 
% IV is a matrix stored in results.mat 
newIV = results.IV(:,id); 

aber ich laufe in ein Problem und immer diese Fehlermeldung:

'IV' cannot be indexed with class 'logical'. Indices must be numeric. 

Ich verstehe nicht, was dieses Problem verursacht. Ich habe den gleichen Code zuvor verwendet und es funktionierte, das einzige war, dass ich die Struct-Ergebnisse vorher nicht laden musste, ich hatte es bereits im Speicher. Es wird seltsamer; dies funktioniert:

IV = results.IV; 
newIV = IV(:,id); % this works somehow 

Dies funktioniert auch:

results_raw = matfile('results.mat'); 
results = struct('IV',results_raw.IV); 
newIV = IV(:,id); % this also works!!! why matlab, why??? 

Ich habe auch versucht die results.mat Datei resaving die -v7.3 Flag verwendet, aber es hat das Problem nicht lösen. Das Problem scheint mit dem Laden der .mat Datei zu sein, weil ich eine Struktur mit einer Matrix erstellt und logische Indexierung verwendet habe, und es hat gut funktioniert.

Frage: Warum funktioniert die Indizierung, wenn ich results.IV an IV übergebe? Wie kann ich es mit results.IV arbeiten lassen?

Danke für Ihre Hilfe !!! : D

+3

scheint, Sie können nicht, wie andere Einschränkungen, wie sie in der 'matfile' Seite explizit dokumentiert: https://www.mathworks.com/help/matlab/ref/matfile.html#bt2ft8s-6 Wenn Sie Weisen Sie die Daten einer anderen Variablen zu, sie hat einen neuen Datentyp und alle Daten im Arbeitsbereich haben nichts mit 'matfile' zu ​​tun. – Adiel

Antwort

1

Wie @Adiel in Fragen Kommentare sagte. Sie können logical Indizes nicht verwenden. Also, konvertieren logical Indizes zu numeric Indizes mit find.

results = matfile('results.mat'); 
% id is my logical vector of the appropriate size 
% IV is a matrix stored in results.mat 
newIV = results.IV(:,find(id)); 
+0

Dies funktioniert nur, wenn 'id' die gleiche Dimension von 'results.IV' hat. Da 'results.IV' eine Matrix ist, müssten" id "eine Matrix sein, damit' find (id) 'wie vorgesehen funktioniert. Wenn 'id' ein Vektor ist, wird im Fall der linearen Indexierung sogar 'find (id)' nicht funktionieren, da 'matfile keine lineare Indexierung unterstützt'. Die Lösung scheint "results.IV" in eine Matrix im Arbeitsbereich zu kopieren. –

Verwandte Themen