3 Stimmen

Um Speicher in Matlab im Voraus zuzuweisen, möchte ich mein Array von Objekten initialisieren. Wie mache ich das?

Ich habe eine Klasse von Objekten namens Blöcke. Aktuell erstelle ich ein Array von Blöcken mithilfe einer for-Schleife, indem ich sie einfach an ein leeres Array anhänge

blockArray=[];
for ii=1:Größe   
    blockArray=[blockArray block(....)];      
end

Um Speicher vorab zuzuweisen, wie initialisiere ich ein Objektarray von Blöcken mit Dummy-Werten?

Zum Beispiel, wenn ich anstelle von Blockobjekten Zahlen verwendet hätte, könnte ich leicht vorab allozieren, indem ich zeros(1,Größe) verwenden würde. Gibt es etwas ähnliches, das ich tun könnte?

5voto

Noah Punkte 93

Die Matlab-Dokumentation beschreibt

Um das Objekt-Array voranzuweisen, weisen Sie zunächst das letzte Element des Arrays zu. MATLAB® füllt die ersten bis vorletzten Array-Elemente mit Standard-DocArrayExample-Objekten.

Also ist es einfacher, anstatt von 1:Größe zu iterieren, dies zu tun...

blockArray = []
blockArray(size) = block(...)

1voto

Daniel Punkte 36242

Die Sprache unterstützt dies eigentlich nicht wirklich, es gibt mehrere Lösungen (oder Workarounds).

Replikation des ersten Falls

Wenn das erste Element in das Array eingefügt wird, können Sie das gesamte Array mit diesem Element füllen, um eine Vorabzuweisung zu erreichen. Dies mag sehr schlecht aussehen, aber es ist tatsächlich die schnellste Möglichkeit, die mir bekannt ist.

for ii=1:S
    %Annahme: e ist ein Skalar, sonst ist der Code völlig durcheinander
    e=block(....)
    if ii==1
       %zur Vorabzuweisung, füllen Sie es mit Ihrem ersten Element
       blockArray(1:S)=e
    else
       blockArray(ii)=e
    end      
end

Verwenden von Zellenarrays

Eine offensichtlich einfache Lösung, Sie können jede Klasse in die Felder einfügen

blockArray=cell(S,1);
for ii=1:S
    %Annahme: e ist ein Skalar, sonst ist der Code völlig durcheinander
    e=block(....)
    blockArray{ii}=e
end

Diese Lösung ist sehr einfach, aber langsamer als die erste. Sie verlieren auch einige Funktionen, die für Zellenarrays nicht verfügbar sind

Lassen Sie Ihre Klasse Array-Funktionalität implementieren

classdef A
properties
    arg1
    out
end
methods
    function  obj = A(varargin)
        if nargin==0
            %Null-Objektkonstruktor
        elseif strcmpi(varargin{1},'createarray')
            sz=varargin(2:end);
            %Vorabzuweisung
            obj(sz{:})=A;
        else
            %Standardkonstruktor
            obj.arg1=varargin{1};
            obj.out=[1 2 3;];
        end
    end

end
end

Ein Konstruktor ohne Eingabeparameter erstellt ein "leeres" oder "null" Objekt, dies wird verwendet, um vorab zu zuweisen, also sollte es leer sein. Ein Konstruktor mit dem ersten Parameter makearray erstellt ein Array Ansonsten sollte Ihr Konstruktor aufgerufen werden.

Verwendung:

%Erstellen Sie ein leeres Objekt
A
%Erstellen eines Arrays der Größe 2,3,4
A('createarray',2,3,4)
%Verwenden Sie den Standardkonstruktor
A(2)

Der größte Nachteil ist, dass Sie Ihre Klassen anpassen müssen. Diese Lösung wurde nie getestet, aber sie sollte in der Leistung der ersten nah kommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X