我正在运行模拟,我生成巨大的2d稀疏矩阵,因此我使用FIND函数仅存储非零值及其索引。
现在,对于for循环的每次迭代,我都会生成这样的矩阵,因为它们的长度都不同,所以我使用cell-array来存储这些配置。但是对于大型模拟,甚至挤出的单元阵列格式也超过了它的内存限制,因此我想在运行代码时编写这些单元阵列,即每次迭代都会在现有的mat文件中附加一个新元素。
例如。
for n=1:10
A=rand(5);
[i,j,vals]=find(A);
data={[i,j,vals]};
save('data','data','-append');
end
这里我的最终目标是有一个mat文件,其中“data”中的元素数量为10.但是由于内存问题,我无法将其保存在for循环之外我想生成数据{n}并将其附加到逐列增长的时尚。最终给我数据{10}。
我尝试使用MATFILE,但它给出了错误,它不能与{}一起使用,因此无法使用单元格数组。
谢谢你, 尼丁
答案 0 :(得分:1)
只要您不尝试索引到实际单元格,就可以将matfile与单元格一起使用。请记住,单元格仍然是数组,因此您可以使用数组索引访问每个单元格。例如:
>> x = {'this', 'is', 'an', 'example'};
>> x{4}
ans =
example
>> x(4)
ans =
'example'
以下只是初始化数据。确保使用'-v7.3'标记保存它,以便它支持有效的部分保存和加载。
data = {};
save('data.mat', 'data', '-v7.3');
现在您可以使用matfile访问您的数据
mf = matfile('data.mat', 'Writable', true);
for n=1:10
A=rand(5);
[i,j,vals]=find(A);
data={[i,j,vals]};
mf.data(end+1, 1) = data;
end
答案 1 :(得分:0)
您无法将数据附加到save
的现有变量。您需要不同的变量:
clear all
filename = 'data.mat';
save(filename) %// empty file, for now. We'll append variables within the loop
for n = 1:10
A = rand(5);
[i,j,vals] = find(A);
varname = ['data' num2str(n)]; %// varname is 'data1', 'data2' etc
assignin('base',varname,[i,j,vals]); %// create that variable
save(filename, varname, '-append') %// append it to file
end