Ich muss große Mengen von Tabellendaten gemischten Typs verarbeiten - Strings und Doubles. Ein Standardproblem, würde ich denken. Was ist die beste Datenstruktur in Matlab für die Arbeit mit diesem?Matlab Datenstruktur für gemischten Typ - was ist zeit- und platzsparend?
Cellarray ist definitiv nicht die Antwort. Es ist extrem speicherineffizient. (Tests unten gezeigt). Dataset (von stats toolbox) ist furchtbar zeit- und platzineffizient. Das lässt mich mit structarray oder Struktur von Arrays. Ich habe einen Test über alle vier verschiedenen Optionen für Zeit und Speicher unten durchgeführt und es scheint mir, dass die Struktur der Arrays die beste Option für die Dinge ist, für die ich getestet habe.
Ich bin relativ neu in Matlab und das ist ein bisschen enttäuschend, ehrlich gesagt. Wie auch immer - auf der Suche nach Ratschlägen, ob ich etwas vermisse oder ob meine Tests genau/angemessen sind. Fehle ich andere Überlegungen neben dem Zugriff/Konvertierung/Speichernutzung, die wahrscheinlich kommen, wenn ich mehr Code mit diesem Zeug code. (fyi mit R2010b)
* * Test # 1: Zugriffsgeschwindigkeit Zugriff auf ein Datenelement.
cellarray:0.002s
dataset:36.665s %<<< This is horrible
structarray:0.001s
struct of array:0.000s
* * Test # 2: Umwandlung Geschwindigkeit und Speicherverbrauch sank I-Datensatz aus diesem Test.
Cellarray(doubles)->matrix:d->m: 0.865s
Cellarray(mixed)->structarray:c->sc: 0.268s
Cellarray(doubles)->structarray:d->sd: 0.430s
Cellarray(mixed)->struct of arrays:c->sac: 0.361s
Cellarray(doubles)->struct of arrays:d->sad: 0.887s
Name Size Bytes Class Attributes
c 100000x10 68000000 cell
d 100000x10 68000000 cell
m 100000x10 8000000 double
sac 1x1 38001240 struct
sad 1x1 8001240 struct
sc 100000x1 68000640 struct
sd 100000x1 68000640 struct
================== CODE: TEST # 1
%% cellarray
c = cell(100000,10);
c(:,[1,3,5,7,9]) = num2cell(zeros(100000,5));
c(:,[2,4,6,8,10]) = repmat({'asdf'}, 100000, 5);
cols = strcat('Var', strtrim(cellstr(num2str((1:10)'))))';
te = tic;
for iii=1:1000
x = c(1234,5);
end
te = toc(te);
fprintf('cellarray:%0.3fs\n', te);
%% dataset
ds = dataset({ c, cols{:} });
te = tic;
for iii=1:1000
x = ds(1234,5);
end
te = toc(te);
fprintf('dataset:%0.3fs\n', te);
%% structarray
s = cell2struct(c, cols, 2);
te = tic;
for iii=1:1000
x = s(1234).Var5;
end
te = toc(te);
fprintf('structarray:%0.3fs\n', te);
%% struct of arrays
for iii=1:numel(cols)
if iii/2==floor(iii/2) % even => string
sac.(cols{iii}) = c(:,iii);
else
sac.(cols{iii}) = cell2mat(c(:,iii));
end
end
te = tic;
for iii=1:1000
x = sac.Var5(1234);
end
te = toc(te);
fprintf('struct of array:%0.3fs\n', te);
============= ===== Code: TEST # 2
%% cellarray
% c - cellarray containing mixed type
c = cell(100000,10);
c(:,[1,3,5,7,9]) = num2cell(zeros(100000,5));
c(:,[2,4,6,8,10]) = repmat({'asdf'}, 100000, 5);
cols = strcat('Var', strtrim(cellstr(num2str((1:10)'))))';
% c - cellarray containing doubles only
d = num2cell(zeros(100000, 10));
%% matrix
% doubles only
te = tic;
m = cell2mat(d);
te = toc(te);
fprintf('Cellarray(doubles)->matrix:d->m: %0.3fs\n', te);
%% structarray
% mixed
te = tic;
sc = cell2struct(c, cols, 2);
te = toc(te);
fprintf('Cellarray(mixed)->structarray:c->sc: %0.3fs\n', te);
% doubles
te = tic;
sd = cell2struct(d, cols, 2);
te = toc(te);
fprintf('Cellarray(doubles)->structarray:d->sd: %0.3fs\n', te);
%% struct of arrays
% mixed
te = tic;
for iii=1:numel(cols)
if iii/2==floor(iii/2) % even => string
sac.(cols{iii}) = c(:,iii);
else
sac.(cols{iii}) = cell2mat(c(:,iii));
end
end
te = toc(te);
fprintf('Cellarray(mixed)->struct of arrays:c->sac: %0.3fs\n', te);
% doubles
te = tic;
for iii=1:numel(cols)
sad.(cols{iii}) = cell2mat(d(:,iii));
end
te = toc(te);
fprintf('Cellarray(doubles)->struct of arrays:d->sad: %0.3fs\n', te);
%%
clear iii cols te;
whos
während "Dataset" in der Tat langsam ist, ist Ihr Timing schrecklich langsam. Ich bekomme 'Dataset: 0.7s' beim Zugriff, während die anderen in der gleichen Reihenfolge wie deine sind. Im Ausführen von R2013a auf 32-Bit WinXP – Amro