Matlab 使用matfile()将数据附加到保存的变量

Matlab 使用matfile()将数据附加到保存的变量,matlab,append,mat-file,Matlab,Append,Mat File,我有一些随机2D数据fuffa,保存到文件fuffalo: fuffa=rand(10,10); save('fuffalo','fuffa', '-v7.3') 然后,我通过一个循环生成我想要附加(第三维)到保存变量的其他fuffa数据。为此,我尝试应用以下建议: m1 = matfile('fuffalo.mat', 'Writable', true); for ii=1:3 fuffa2=rand(10,10); m1.fuffa(1:10,1:10,end+1)=

我有一些随机2D数据
fuffa
,保存到文件
fuffalo

fuffa=rand(10,10);
save('fuffalo','fuffa', '-v7.3')
然后,我通过一个循环生成我想要附加(第三维)到保存变量的其他
fuffa
数据。为此,我尝试应用以下建议:

m1 = matfile('fuffalo.mat', 'Writable', true);

for ii=1:3
   fuffa2=rand(10,10);    
   m1.fuffa(1:10,1:10,end+1)=fuffa2;
end
但是,在
ii=2时,我得到以下错误:

变量“fuffa”在文件中有2个维度,这与索引下标中的3个维度不匹配


我怎样才能说服MATLAB在第三维中追加?

因为您访问的是磁盘上的文件,而不是工作空间变量,所以在扩展维度数量时可能会遇到问题。处理存储在内存中的变量时不会出现此问题(例如,如果使用
load
而不是
matfile

为了避免这种情况,最好的方法是。我将假设这是对实际问题的简化,您需要能够对潜在的2D阵列进行3D扩展

在这种情况下,只需使用
cat
在第三维中连接:

fuffa=rand(10,10);
save('fuffalo','fuffa', '-v7.3')
m1 = matfile('fuffalo.mat', 'Writable', true);
for ii=1:3
    fuffa2=rand(10,10);
    % Concatenating in the 3rd dimension, avoiding used 'end' which 
    % assumes that dimension already exists
    m1.fuffa=cat(3,m1.fuffa,fuffa2);
end
% m1.fuffa <10x10x4 double>
fuffa=rand(10,10);
保存('fuffalo'、'fuffa'、'-v7.3')
m1=matfile('fuffalo.mat','Writable',true);
对于ii=1:3
fuffa2=兰特(10,10);
%在第三维中连接,避免使用
%假设维度已经存在
m1.fuffa=cat(3,m1.fuffa,fuffa2);
结束
%m1.fuffa
注意,通过这样做,您将把整个.mat数据放入内存进行连接,从而克服了
matfile()
的缺点。但是,您以前的方法将面临相同的问题,因为在中我们看到:

使用
end
关键字作为索引的一部分会导致MATLAB将整个变量加载到内存中


如前所述,预分配可能会更好

你能在第一维度追加吗
fuffa=rand(1,10,10)
我想是的。你知道为什么它会这样工作吗?因为matlab会自动删除前两个维度之后的尾随单体维度。不仅在
ii=2
处,你还应该得到
ii=1
以及前两个维度的错误。不是参赛作品。所以[20x1]向量保持为[20x1]向量。但是[20 x 20 x 1]矩阵变成了[20 x 20]矩阵。第三个维度(单体维度)被删除。这是matlab的一个怪癖。该文件是一个HDF5容器。其中的数据具有固定的尺寸,但您也可以先存储一个3D矩阵
10x10x2
,然后覆盖第二个fuffa。然后,它在容器中被指定为3D,您应该能够附加到它。
matfile()
函数允许用户直接从磁盘上的文件而不是内存中访问数据。“工作区”可能也是我用词不当的地方。有关更多信息,请参见,但基本上这比使用
load
加载大型数据集要快,因为数据从未完全加载到内存中。因此工作区中有一个
MAT文件
对象,但它不包含数据,只引用它。