Im Wesentlichen möchte ich wissen, ob es eine effiziente Möglichkeit gibt, in ein CellArray von Klassenobjekten zu indizieren, um nur diejenigen hervorzuheben, die einen bestimmten Eigenschaftswert haben, an dem wir interessiert sind Schleifen und ich frage mich, ob ich etwas tun kann, um es zu vektorisieren oder möglicherweise eine Art von logischer Indizierung zu verwenden. Leider scheinen meine Suchen keine Antwort zu finden, eine logische Indizierung in CellArrays mit Objekten scheint nicht etwas zu sein, was viele Leute machen möchten ...Matlab: Extrahieren von Objekten innerhalb einer Zelle Array mit einem bestimmten Eigenschaftswert
Hier ist ein minimales funktionierendes Beispiel der Funktion I ' Ich versuche mich zu verbessern. Andere Code-Teile für einen MWE sind unten.
Ich bin mir bewusst, dass es klüger sein kann, dieses Problem zu beheben, indem Sie den Rest der Implementierung ändern, um dies überhaupt zu vermeiden. Ich würde es jedoch vorziehen, dies möglichst zu vermeiden.
EDIT: In meinem typischen Anwendungsfall ist die Anzahl der Zellobjekte klein (etwa 10 oder 20), aber die ineffiziente Methode wird oft aufgerufen (Tausende von Malen). So kleine Array, finden viele Operationen.
%% is there a "more matlab"/faster way to do this?
function outputCellArray = ThereMustBeABetterWayToDoThis(cellArrayOfClassObjects,arrayOfTypesToFind)
outputCellArray = {};
for iType = 1:numel(arrayOfTypesToFind)
thisType = arrayOfTypesToFind(iType); % this line is the real bottleneck according to the profiler
for iObject = 1:numel(cellArrayOfClassObjects)
thisClassObj = cellArrayOfClassObjects{iObject};
if (thisClassObj.specificEnumType == thisType) % this line is also quite slow
outputCellArray{end+1} = thisClassObj;
end
end
end
Klassendefinitionen:
classdef MyClass < handle %% dummy example class
properties
specificEnumType;
x;
y;
end
methods
function this = MyClass(x,y,specificEnumType)
this.specificEnumType = specificEnumType;
this.x = x;
this.y = y;
end
end
end
und ein anderer:
classdef EnumType < uint32 %%dummy example class
enumeration
Type0 (0),
Type1 (1),
Type2 (2),
Type3 (3)
end
end
Script, das Ganze zu nennen:
% use this script to call the whole thing
%% we have a cell array of class objects: they each have different enumTypes as a property
cellArrayOfClassObjects{1} = MyClass(rand,rand,EnumType.Type0);
cellArrayOfClassObjects{2} = MyClass(rand,rand,EnumType.Type1);
cellArrayOfClassObjects{3} = MyClass(rand,rand,EnumType.Type2);
cellArrayOfClassObjects{4} = MyClass(rand,rand,EnumType.Type3);
cellArrayOfClassObjects{5} = MyClass(rand,rand,EnumType.Type3);
cellArrayOfClassObjects{6} = MyClass(rand,rand,EnumType.Type2);
%% we want to find the ones that have these specific enumTypes
arrayOfTypesToFind = [EnumType.Type0,EnumType.Type2];
%% there must be a better way than this inefficient method
outputArray = ThereMustBeABetterWayToDoThis(cellArrayOfClassObjects,arrayOfTypesToFind);
Danke. Ich werde es versuchen und sehen, wie es mit den "echten" Klassen funktioniert, die viel mehr los sind. – FakeDIY
Interessanterweise ist Ihre Methode schneller, wenn die Anzahl der Objekte groß ist, aber langsamer, wenn das Objekt cellarray klein ist (versuchen Sie es mit einem Array von 10 Objekten, aber machen Sie den Fundprozess viel mehr).Ich nehme an, dies ist, weil der Overhead von Mat2cell usw. auf eine kleine Anzahl von Objekten nicht lohnt. – FakeDIY