我正在尝试使用hdf5接口就地修改mat文件。
我有一个简单的mat文件包含一个大小为[K x L * M]的2D数组,并且希望将其重新整形为大小为[K x L x M]的3D数组,而不修改数据或数据类型。通常我会读取数据,做一个val =重塑(val,[K,L,M]);并将其写回文件。但是,我可以通过简单地修改数据集大小/ MaxSize属性来实现这一目标吗?
这是我到目前为止所拥有的;它似乎应该有效,但事实上并非如此:
%%
val = rand(4,9);
save('test.mat','val','-v7.3');
h5disp('test.mat');
%%
fid = H5F.open('test.mat','H5F_ACC_RDWR','H5P_DEFAULT');
dset_id = H5D.open(fid,'/val');
space_id = H5D.get_space(dset_id);
H5S.set_extent_simple(space_id,3,fliplr([4,3,3]),fliplr([4,3,3]));
[ndims,h5_dims] = H5S.get_simple_extent_dims(space_id)
H5F.close(fid);
h5disp-command显示没有任何变化:
>> h5disp('test.mat')
Group '/'
Dataset 'val'
Size: 4x9
MaxSize: 4x9
Datatype: H5T_IEEE_F64LE (double)
ChunkSize: []
Filters: none
FillValue: 0.000000
Attributes:
'MATLAB_class': 'double'
有什么想法吗?有更简单的方法吗?
答案 0 :(得分:0)
这是一个使用matlab函数matfile
的工作解决方案,它部分读/写.mat
文件。这里,变量A
在.mat
文件中重新整形而不加载它。
A = rand(2,3*4); %some data in A
save('A.mat', 'A','-v7.3'); %save variable A in A.mat
A1 = reshape(A,2,3,4); %create A1 as a reshape of A for later comparison
clear A %clear A
%modification of the variable within the .mat file
matObj = matfile('A.mat','Writable',true); %partial load of A
matObj.A = reshape(matObj.A,2,3,4); %reshape saved in A2
%comparison
load('A.mat'); %load the in-mat reshaped version of A
A2 = A;
isequal(A1, A2)