如何附加.mat文件行或列方式单元格矩阵

时间:2014-06-06 13:20:19

标签: matlab cell-array mat-file

我正在运行模拟,我生成巨大的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,但它给出了错误,它不能与{}一起使用,因此无法使用单元格数组。

谢谢你, 尼丁

2 个答案:

答案 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

参考:matfile documentation

答案 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