2013-09-05 3 views
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-명령은 아무것도 변경되지 것을 보여줍니다

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

HDF5 파일에서 데이터 세트의 차원 수를 변경할 수 없습니다. 이를 수행하는 유일한 방법은 원하는 차원으로 새 데이터 집합을 만드는 것입니다. – Yossarian

+0

@ Yossarian 정말 그렇게하니? 4x9와 4x3x3 데이터 세트의 유일한 차이점은 '크기'/ 'MaxSize'태그라고 생각했을 것입니다. 데이터 그 자체는 순차적으로 저장됩니다. 그렇지 않습니다. 단순히 해석을 바꾸는 문제 일뿐입니다. 어쨌든, 그건 꽤 이상한 한계처럼 보입니다. 왜 이것이 그렇게 된 것인지 알고 싶습니까? – DNF

+0

데이터가 디스크에 저장되는 방법은 메모리의 표현과 완전히 다를 수 있습니다. 기본적으로 HDF5는 B- 트리를 사용하여 데이터를 저장하므로 데이터가 디스크에 순차적으로 있다는 보장이 없으며 크기를 조정하려는 데이터가 있다면 원하지 않을 것입니다. 또한 데이터 집합의 크기를 조정할 수는 있지만 크기를 변경할 수는 없습니다. 이렇게하려면 청크를 사용해야하며 matlab에서 사용하지 않는 것으로 보입니다. – Yossarian

답변

0

여기에 파일을 부분적으로 읽고 쓰는 matlab의 함수 matfile을 사용하는 작업 솔루션이 있습니다. 여기서 변수 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) 
+0

불행히도,이 솔루션은 파일에서 변수를로드하여 재 형성 기능에 전달하는 것 같습니다. 그런 다음 reshape는 파일에 다시 기록되는 배열을 반환합니다. 메모리 사용을 주시하면서 10000x10000 배열을 만들고이를 재구성하여이 사실을 알 수 있습니다. 또한 내 컴퓨터에서 메모리에있는 모양이 0.000015 초 걸리는 반면 파일에서 모양을 변경하는 데는 40 초가 걸립니다. 시간 사용에 많은 차이가 없어야합니다. – DNF