【问题标题】:How to append in .mat file row or columnwise cellmatrix如何在 .mat 文件中追加行或列单元矩阵
【发布时间】:2014-07-27 18:51:56
【问题描述】:

我正在运行一个模拟,其中我生成巨大的 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,但它给我的错误是它不适用于 {},因此不适用于元胞数组。

谢谢你, 尼丁

【问题讨论】:

  • 这是一个非常好的问题。尽管我不知道如何解决您的问题,但我只想问您为什么打算这样做。如果您在保存变量时遇到这个问题,那么您将来在加载时也会遇到它。因此,您应该避免这种情况。为什么不按照 Luis Mendo 的建议保存它?
  • 使用 MATFILE 函数(如果它适用于单元格数组),如果我得到它写入 .mat 文件的一部分,那么我也可以在不加载文件的情况下读取文件的一部分。因此,我想要的只是 MATFILE 可以与单元数组一起使用。
  • 我很好奇你为什么不使用 MATLAB 的原生稀疏格式而不是滚动你自己的格式。

标签: matlab cell-array mat-file


【解决方案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

【讨论】:

  • 非常感谢。这大致就是我想要的。
【解决方案2】:

您不能使用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

【讨论】:

  • 我想过,但问题是我的 .mat 文件中会有数百万个变量。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2015-11-04
  • 2014-10-13
  • 1970-01-01
相关资源
最近更新 更多