2017-01-29 5 views
5

Bis vor kurzem habe ich in struct s in MATLAB Speicherung von Zeitreihendaten durch den Index nach die Feldnamen vergeben, zB:Effiziente Indexierung von Strukturen in MATLAB

Structure.fieldA(1) = 23423 

So ist die Struktur hat eine Reihe von Feldern, und jedes Feld ist ein Vektor.

Ich habe eine Menge von anderen Programmen ein anderes Format verwenden gesehen, wo die Struktur selbst indiziert ist, und jeder Index der Struktur enthält eine Reihe von Feldern, zB:

Structure(1).fieldA 

Welche ist die effizienteste Methode? Sollte ich bei der Top-Option bleiben oder sollte ich meine Programme auf die Bottom-Methode umstellen?

Antwort

5

A struct der jedes Feld ein Feld ist, ist leistungsfähiger, da sie weniger Datenelemente (ein Array pro Feld), während ein struct Array mehr Flexibilität auf Kosten der Leistung und Speichernutzung hat (auf Element pro struct pro Feld) aufweisen .

Aus eigenen den MATLAB documentation

Strukturen erfordern eine ähnliche Menge an Aufwand pro Feld. Strukturen mit vielen Feldern und kleinen Inhalten haben einen großen Aufwand und sollten vermieden werden. Ein großes Array von Strukturen mit numerischen Skalarfeldern erfordert viel mehr Speicher als eine Struktur mit Feldern, die große numerische Arrays enthalten.

Wir können die Nutzungs Speicher überprüfen Sie mit einem einfachen Beispiel

S = struct('field1', {1, 2}, 'field2', {3, 4}); 
SArray = struct('field1', {[1,2]}, 'field2', {[3,4]}); 

whos S* 
% Name  Size   Bytes Class  Attributes 
% 
% S   1x2    608 struct 
% SArray  1x1    384 struct 

Einige der Flexibilität durch eine struct Array lieferte umfasst der Lage ist, leicht eine Teilmenge der Daten zu greifen:

subset = SArray(1:3); 

% Compared to 
subset.field1 = S.field1(1:3); 
subset.field2 = S.field2(1:3); 

Außerdem können Daten unterschiedlicher Größe gespeichert werden, die nicht einfach in ein Array passen.

S(1).field1 = [1,2]; 
S(2).field1 = 3; 

Welche Lösung ist besser, hängt wirklich von den Daten und wie Sie es verwenden. Wenn Sie eine große Datenmenge haben, ist die erste Option aufgrund des geringeren Speicherbedarfs wahrscheinlich vorzuziehen.

Wenn Sie Code für Sie arbeiten, würde ich nicht sorgen, um es nur für eine andere Konvention zu konvertieren, es sei denn, Sie Probleme mit der Leistung (in diesem Fall verwenden Sie eine struct Arrays) oder Schwierigkeiten beim Zugriff/Ändern der Daten (verwenden Sie das Array struct).

Verwandte Themen