1

hdf5 インターフェイスを使用してマット ファイルをインプレースで変更しようとしています。

サイズ [K x L*M] の 2D 配列を含む単純なマット ファイルがあり、データまたはデータ型を変更せずにサイズ [K x L x M] の 3D 配列に再形成したいと考えています。通常、データを読み取り、val = reshape(val,[K,L,M]); を実行します。そしてそれをファイルに書き戻します。しかし、Dataset Size/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'

何か案は?もっと簡単な方法はありますか?

4

1 に答える 1

0

これは、ファイルmatfileを部分的に読み書きするmatlabの機能を使用した実用的なソリューションです。.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)
于 2013-09-05T12:34:40.503 に答える