it-swarm.com.de

Matrix von Matrizen in MATLAB

Ich suche nach einer Möglichkeit, eine große variable Anzahl von Matrizen in einem Array in MATLAB zu speichern.

Gibt es Möglichkeiten, dies zu erreichen?

Beispiel:

for i: 1:unknown
  myArray(i) = zeros(500,800);
end

Wo unbekannt ist die unterschiedliche Länge des Arrays, kann ich mit zusätzlichen Informationen bei Bedarf überarbeiten.

Update: Leistung ist der Hauptgrund, warum ich versuche, dies zu erreichen. Ich hatte es vor, wo es die Daten als einzelne Matrix erfassen, in Echtzeit anzeigen und dann mit der Verarbeitung des nächsten Datensatzes fortfahren würde.

Ich habe versucht, mehrdimensionale Arrays zu verwenden, wie unten von Rocco vorgeschlagen. Meine Daten sind jedoch so groß, dass mir der Speicher ausgeht. Möglicherweise muss ich eine andere Alternative für meinen Fall suchen. Wird aktualisiert, wenn ich andere Vorschläge versuche.

Update 2: Vielen Dank für Ihre Vorschläge. Ich hätte sie jedoch im Voraus spezifizieren sollen. Präzision UND Geschwindigkeit sind hier ein wesentlicher Faktor. Ich muss möglicherweise zu meiner ursprünglichen Methode zurückkehren, bevor ich 3D-Arrays versuche und die Methode erneut evaluiere zum Einlesen der Daten.

39
user57685

Wenn alle Matrizen dieselbe Größe haben (d. H. 500 x 800), können Sie einfach ein 3D-Array erstellen:

nUnknown;  % The number of unknown arrays
myArray = zeros(500,800,nUnknown);

Um auf ein Array zuzugreifen, verwenden Sie die folgende Syntax:

subMatrix = myArray(:,:,3);  % Gets the third matrix

Sie können myArray auf verschiedene Arten um weitere Matrizen erweitern:

myArray = cat(3,myArray,zeros(500,800));
% OR
myArray(:,:,nUnknown+1) = zeros(500,800);

Wenn jede Matrix nicht dieselbe Größe haben soll, müssen Sie Zellen-Arrays verwenden, wie von Hosam vorgeschlagen.

BEARBEITEN: Ich habe den Teil über den Mangel an Speicher verpasst. Ich vermute, Ihr Unbekannter ist ziemlich groß. Möglicherweise müssen Sie den Datentyp der Matrizen ändern (einzelner oder sogar ein uintXX-Typ, wenn Sie Ganzzahlen verwenden). Sie können dies im Aufruf von Nullen tun:

myArray = zeros(500,800,nUnknown,'single');
43
gnovice

Verwenden Sie Zellarrays. Dies hat gegenüber 3D-Arrays den Vorteil, dass nicht ein zusammenhängender Speicherplatz zum Speichern aller Matrizen erforderlich ist. Tatsächlich kann jede Matrix in einem anderen Speicherbereich gespeichert werden, wodurch Sie vor Fehlern aufgrund von Speichermangel geschützt werden, wenn Ihr freier Speicher fragmentiert ist. Hier ist eine Beispielfunktion zum Erstellen Ihrer Matrizen in einem Zellenarray:

function result = createArrays(nArrays, arraySize)
    result = cell(1, nArrays);
    for i = 1 : nArrays
        result{i} = zeros(arraySize);
    end
end

Um es zu benutzen:

myArray = createArrays(requiredNumberOfArrays, [500 800]);

Und um auf Ihre Elemente zuzugreifen:

myArray{1}(2,3) = 10;

Wenn Sie die Anzahl der Matrizen nicht im Voraus kennen, können Sie einfach die dynamische Indizierung von MATLAB verwenden, um das Array so groß wie nötig zu machen. Der Leistungsaufwand ist proportional zur Größe des Arrays cell und wird von der Größe der Matrizen selbst nicht beeinflusst. Beispielsweise:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
70
Hosam Aly
myArrayOfMatrices = zeros(unknown,500,800);

Wenn Ihnen der Speicher ausgeht, müssen Sie mehr RAM in Ihr System werfen und sicherstellen, dass Sie ein 64-Bit-Betriebssystem verwenden. Versuchen Sie auch, Ihre Präzision zu reduzieren (brauchen Sie wirklich Doppel oder können Sie mit Einzel auskommen?):

myArrayOfMatrices = zeros(unknown,500,800,'single');

Um an dieses Array anzuhängen, versuchen Sie:

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
1
joe

Ich habe ein Volume-Rendering in Oktave (Matlab-Klon) durchgeführt und meine 3D-Arrays (dh ein Array von 2D-Slices) mit erstellt

buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);

Der Speicherverbrauch schien effizient zu sein. (Kann für die nachfolgende Rechengeschwindigkeit nicht dasselbe sagen: ^)

0
timday