2011-01-28 1 views
2

는, MATLAB에서 hdf5write 방법은 자동으로 열 벡터 내 행 벡터로 변환되어 그들을 다시 읽기 :행 벡터를 MATLAB에서 HDF로 저장할 수 있습니까? 나는이 때 몇 가지 이유를 들어

>> hdf5write('/tmp/data.h5','/data',rand(1,10)); 
>> size(hdf5read('/tmp/data.h5','/data')) 

ans = 

    10  1 

그러나, 제 3 차원의 행 벡터에 대해, 그것이 잘 돌아 오면 :

>> hdf5write('/tmp/data.h5','/data',rand(1,1,10)); 
>> size(hdf5read('/tmp/data.h5','/data')) 

ans = 

    1  1 10 

어떻게 hdf5write은 행 벡터를 위해 옳은 일을 할 수 있습니까? 그들은 내가 대신 hdf5read의, 실제로 나중에 데이터를 읽을 C 기반 MEX를 사용하고 있기 때문에하지 10 × 1

편집 문제가 약간 더 복잡하다, 1 ×로 돌아 오는되어야한다. 또한, 문제 정말hdf5write에, 이것은 HDF5 파일 자체에 볼 수 있습니다 :

입니다
>> hdf5write('/tmp/data.h5','/data',randn(1,10)); 
>> ! h5ls /tmp/data.h5 

data      Dataset {10} 

는, 데이터가 HDF5 파일의 1 차원 배열로 저장됩니다. 비교를 위해 실제 2 차원 행렬 (같은 모양을 보여주기 위해), 1 차원 열 벡터, 3 차원을 따르는 1 차원 벡터, 그리고 킥을 시도 할 때 같은 것을 시도합니다. V71Dimensions 트릭 hdf5readhdf5write 모두의 도움에되는 :

>> hdf5write('/tmp/data.h5','/data',randn(10,1)); %1-d col vector 
>> ! h5ls /tmp/data.h5 

data      Dataset {10} 
>> hdf5write('/tmp/data.h5','/data',randn(1,1,10)); %1-d vector along 3rd dim; annoying 
>> ! h5ls /tmp/data.h5 

data      Dataset {10, 1, 1} 
>> hdf5write('/tmp/data.h5','/data',randn(2,5)); %2-d matrix. notice the reversal in dim order 
>> ! h5ls /tmp/data.h5 

data      Dataset {5, 2} 
>> hdf5write('/tmp/data.h5','/data',randn(1,10),'V71Dimensions',true); %1-d row; option does not help 
>> ! h5ls /tmp/data.h5 

data      Dataset {10} 

그래서, 문제는 hdf5write있는 것으로 보인다. 'V71Dimensions' 플래그가 도움이되지 않습니다. 결과 hdf5 파일은 여전히 ​​데이터 세트 {10,1} 대신 데이터 세트 {10}입니다.

답변

4

독서 문제입니다. help

에서 [...] = hdf5read (... 'V71Dimensions' BOOL)는 파일로부터 판독 된 데이터 세트의 대부분을 변경할지 여부를 지정한다. BOOL이 true이면 hdf5read 은 (MATLAB 7.1 [R14SP3] 및 이전)에서 수행 한 것처럼 의 첫 번째 두 차원을 데이터 집합으로 바꿉니다. 이 동작은 HDF5 및 MATLAB 표현 배열 크기 차이를 설명하기위한 것입니다. HDF5는 데이터 집합 을 행 우선 순서로 설명합니다. MATLAB 은 데이터를 열 주요 순서로 저장합니다. 그러나 이러한 차원을 바꾸는 경우 의도가 데이터의 의도를 정확히 반영하지 않을 수 있으며 메타 데이터가 무효화 될 수 있습니다. 가 파일에 동일한 차원과 일치하는 출력 변수의 각 차원 - BOOL합니다 ( 기본값) false이면, 데이터 크기 제대로이 파일에 기록 으로 데이터 순서를 반영합니다. 따라서

는 :

hdf5write('/tmp/data.h5','/data',rand(1,10)); 
size(hdf5read('/tmp/data.h5','/data','V71Dimensions',true)) 
ans = 
    1 10 
1

난 당신이 matlab에의 낮은 수준의 HDF5 API를 사용해야합니다 이것에 대한 affraid 해요.

Matlab에서 하위 수준 API는 예를 들어 H5.open(...), H5D.write(...) 등을 사용하여 사용할 수 있습니다. 이름은 C 라이브러리의 이름과 정확히 일치합니다 (HDF5 doc 참조). 그러나 그들이 취하는 인수에 약간의 차이가 있지만 matlab에 help 함수는 당신이 알아야 할 모든 것을 알려줍니다 ...

좋은 소식은 Matlab 버전의 API는 여전히 C보다 덜 장황하다 번역. 예를 들어, 변수가 범위를 벗어날 때 Matlab이 닫을 수 있기 때문에 데이터 유형, 데이터 공간 등을 수동으로 닫을 필요가 없습니다.