Matlab 结构数组导入-内存预定位问题
我有几个.mat文件,每个文件都有一个名为DATA的结构数组(长度未知)。我想在单个数组中导入所有这些结构,但不想使用以下代码:Matlab 结构数组导入-内存预定位问题,matlab,memory,data-structures,import,Matlab,Memory,Data Structures,Import,我有几个.mat文件,每个文件都有一个名为DATA的结构数组(长度未知)。我想在单个数组中导入所有这些结构,但不想使用以下代码: FileNames = strcat('file',num2str((1:N)''),'.mat'); DATATemp = []; for int = 1:length(FileNames) load(FileNames(int,:)); DATATemp=[DATATemp DATA]; end DATA = DATATemp; 因为它没
FileNames = strcat('file',num2str((1:N)''),'.mat');
DATATemp = [];
for int = 1:length(FileNames)
load(FileNames(int,:));
DATATemp=[DATATemp DATA];
end
DATA = DATATemp;
因为它没有预先定位阵列的内存
有什么聪明的方法可以做到这一点吗?如果长度足够短,您可以过度分配内存,您可以这样做:选择一个比您将看到的大得多的数组大小,然后在完成后将其修剪回去
FileNames = strcat('file',num2str((1:N)''),'.mat');
DATATemp = zeros(1e6,1);
idx = 1;
for int = 1:length(FileNames)
load(FileNames(int,:));
idx_end = idx + length(DATA) - 1;
DATATemp(idx:idx_end) = DATA;
idx = idx_end + 1;
end
DATA = DATATemp(1:idx_end);
然而,如果您谈论的是大量数据,或者只是想涵盖所有基础数据,则更严格的解决方案是分块分配
FileNames = strcat('file',num2str((1:N)''),'.mat');
CHUNK_SIZE = 1e6;
DATATemp = zeros(INIT_SIZE,1);
idx = 1;
for int = 1:length(FileNames)
load(FileNames(int,:));
idx_end = idx + length(DATA) - 1;
if idx_end > length(DATATemp)
DATATemp = [DATATemp zeros(INIT_SIZE ,1);
DATATemp(idx:idx_end) = DATA;
idx = idx_end + 1;
end
DATA = DATATemp(1:idx_end);
只需确保您的CHUNK_大小明显大于典型单个文件的大小。我在这里选了1e6。如果我加载约20个文件,每个文件的平均大小为1e5,我会选择这个。这样,虽然我仍然在连接更多的空间,但它的频率要低得多。这可能不是很聪明,但我希望能有所帮助
还要注意的是,如果从网络驱动器加载文件,会大大降低速度