2

我正在运行一个模拟,其中我生成巨大的 2d 稀疏矩阵,因此我使用 FIND 函数只存储非零值及其索引。

现在,对于 for 循环的每次迭代,我都会生成这样的矩阵,并且因为它们的长度都不同,所以我使用单元数组来存储这些配置。但是对于大型模拟,即使单元格数组的压缩格式也会超出其内存限制,因此我想在运行代码时编写这些单元格数组,即每次迭代都将一个新元素附加到现有的 mat 文件中。

例如

for n=1:10  
A=rand(5);  
[i,j,vals]=find(A);  
data={[i,j,vals]};  
save('data','data','-append');  
end

在这里,我的最终目标是拥有一个 mat 文件,其中“数据”中的元素数为 10。但由于内存问题,我无法将其保存在 for 循环之外,我想生成数据 {n} 并以列增长方式附加它. 最终给了我数据{10}。

我尝试使用 MATFILE 但它给了我一个错误,它不能与 {} 一起使用,因此不能与单元格数组一起使用。

谢谢你,尼丁

4

2 回答 2

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文档

于 2014-06-06T16:36:17.907 回答
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
于 2014-06-06T13:46:43.680 回答