2017-01-29 16 views
5

Do niedawna byłem przechowywania danych szeregów czasowych w struct sw MATLAB umieszczając wskaźnik po nazwę pola, np:Wydajne indeksowanie struktur w MATLAB

Structure.fieldA(1) = 23423 

Tak, struktura ma zestaw pól, a każde pole jest wektorem.

Widziałem wiele innych programów użyć innego formatu, gdzie struktura sama jest indeksowany, a każdy wskaźnik struktury zawiera zestaw pól, np

Structure(1).fieldA 

Która jest najbardziej wydajna metoda? Czy powinienem trzymać się górnej opcji, czy też powinienem przełączać moje programy na metodę dolną?

Odpowiedz

5

struct gdzie każde pole jest tablicą bardziej wydajnych ponieważ ma mniejszą liczbę elementów (po jednej tablicy na polu), natomiast struct tablicy ma większą elastyczność w kosztów wykonania i pamięci (na elemencie za struct na obszar) .

Od MATLAB własnych documentation

budowle wymagają podobną kwotę nadwyżki przypadającej na polu. Struktury o wielu polach i małych treściach mają duży narzut i należy ich unikać. Duża liczba struktur z numerycznymi polami skalarnymi wymaga znacznie więcej pamięci niż struktura z polami zawierającymi duże tablice numeryczne.

Możemy sprawdzić użycie pamięci o prostym przykładzie

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 

Niektóre elastyczności zapewnianej przez struct tablicy obejmuje jest w stanie łatwo chwycić podzbiór danych:

subset = SArray(1:3); 

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

Możliwość przechowywania danych o różnych rozmiarach, które mogą nie pasować do tablicy.

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

Jakie rozwiązanie jest lepsze, tak naprawdę zależy od danych i sposobu ich użytkowania. Jeśli masz dużą ilość danych, pierwsza opcja będzie prawdopodobnie lepsza ze względu na mniejszy ślad pamięci.

Jeśli używasz kodu, nie martwię się o jego konwersję tylko ze względu na używanie innej konwencji, chyba że masz problemy z wydajnością (w takim przypadku użyj struct z tablic) lub trudności z dostępem/modyfikacją danych (użyj tablicy struct).