주요 콘텐츠

HDF5 파일 가져오기

여러 가지 방법으로 HDF5 파일에서 데이터를 읽을 수 있습니다. 프로그래밍 방식으로 MATLAB®의 하이 레벨 HDF5 함수 또는 HDF5 라이브러리 네임스페이스의 로우 레벨 함수를 사용할 수 있습니다. 대화형 방식으로는 데이터 가져오기 라이브 편집기 작업을 사용하거나 (MATLAB Online™에서) 가져오기 툴 앱을 사용할 수 있습니다.

NCSA(National Center for Supercomputing Application)에서 개발한 HDF5(Hierarchical Data Format, 버전 5)는 과학 데이터를 파일에 저장하기 위한 범용 표준으로 시스템에 상관없이 사용할 수 있습니다. HDF5는 용이한 데이터의 공유를 위해 표준화된 데이터 저장 방식을 요하는 여러 공학 및 과학 분야에서 사용됩니다. HDF5 파일 형식에 대한 자세한 내용은 The HDF Group 웹사이트(https://www.hdfgroup.org)에서 HDF5 문서를 참조하십시오.

참고

별도의 호환되지 않는 형식을 가진 HDF4 파일 가져오기에 대한 자세한 내용은 하이 레벨 함수를 사용하여 HDF4 파일 가져오기 항목을 참조하십시오.

하이 레벨 HDF5 함수를 사용하여 데이터 가져오기

MATLAB에는 HDF5 파일의 내용을 검토하고 파일 데이터를 MATLAB 작업 공간으로 가져오는 데 사용할 수 있는 몇 개의 함수가 포함되어 있습니다.

  • h5disp — HDF5 파일의 내용을 확인합니다.

  • h5info — HDF5 파일을 정의하는 모든 메타데이터가 포함된 구조체를 만듭니다.

  • h5read — HDF5 파일의 데이터셋에서 데이터를 읽습니다.

  • h5readatt — HDF5 파일의 데이터셋과 연관된 특성 또는 파일 자체와 연관된 특성(전역 특성)에서 데이터를 읽습니다.

위 함수를 사용하는 방법에 대한 자세한 내용은 예제가 포함되어 있는 해당 도움말 페이지를 참조하십시오. 다음 섹션에서는 몇 가지 일반적인 사용 시나리오를 보여줍니다.

HDF5 파일의 내용 확인하기

HDF5 파일에는 특성이라는 데이터와 메타데이터가 포함될 수 있습니다. HDF5 파일은 데이터와 메타데이터를 UNIX® 파일 시스템의 계층적 구조와 유사한 계층적 구조로 구성합니다.

HDF5 파일에서는 계층 구조에 있는 디렉터리를 그룹이라고 합니다. 그룹에는 다른 그룹, 데이터셋, 특성, 링크, 데이터형이 포함될 수 있습니다. 데이터셋은 다차원 숫자형 배열 또는 문자열 같은 데이터 모음입니다. 특성은 다른 엔터티와 연관된 모든 데이터(예: 데이터셋)입니다. 링크는 UNIX 파일 시스템의 기호화된 링크와 유사합니다. 링크를 사용하면 객체의 복사본을 만들지 않고도 객체를 참조할 수 있습니다.

데이터형은 데이터셋 또는 특성의 데이터에 대한 설명입니다. 데이터형을 통해 데이터셋의 데이터를 해석하는 방법을 알 수 있습니다.

HDF5 파일의 내용을 빠르게 확인하려면 h5disp 함수를 사용하십시오.

h5disp("example.h5")
HDF5 example.h5 
Group '/' 
    Attributes:
        'attr1':  97 98 99 100 101 102 103 104 105 0 
        'attr2':  2x2 H5T_INTEGER
    Group '/g1' 
        Group '/g1/g1.1' 
            Dataset 'dset1.1.1' 
                Size:  10x10
                MaxSize:  10x10
                Datatype:   H5T_STD_I32BE (int32)
                ChunkSize:  []
                Filters:  none
                Attributes:
                    'attr1':  49 115 116 32 97 116 116 114 105 ...
                    'attr2':  50 110 100 32 97 116 116 114 105 ...
            Dataset 'dset1.1.2' 
                Size:  20
                MaxSize:  20
                Datatype:   H5T_STD_I32BE (int32)
                ChunkSize:  []
                Filters:  none
        Group '/g1/g1.2' 
            Group '/g1/g1.2/g1.2.1' 
                Link:  'slink'
                    Type:  'soft link'
                    Target:  'somevalue'
    Group '/g2' 
        Dataset 'dset2.1' 
            Size:  10
            MaxSize:  10
            Datatype:   H5T_IEEE_F32BE (single)
            ChunkSize:  []
            Filters:  none
        Dataset 'dset2.2' 
            Size:  5x3
            MaxSize:  5x3
            Datatype:   H5T_IEEE_F32BE (single)
            ChunkSize:  []
            Filters:  none
					.
					.
					.

HDF5 파일의 계층적 구성을 살펴보려면 h5info 함수를 사용하십시오. h5info 함수는 파일 이름을 비롯하여 HDF5 파일에 대한 다양한 정보가 포함된 구조체를 반환합니다.

info = h5info("example.h5")
info = 

  struct with fields:

      Filename: 'matlabroot\matlab\toolbox\matlab\demos\example.h5'
          Name: '/'
        Groups: [4×1 struct]
      Datasets: []
     Datatypes: []
         Links: []
    Attributes: [2×1 struct]

Groups 필드와 Attributes 필드를 보면 파일에 4개의 그룹과 2개의 특성이 포함되어 있음을 알 수 있습니다. Datasets 필드, Datatypes 필드, Links 필드는 모두 비어 있습니다. 이는 루트 그룹에 데이터셋, 데이터형 또는 링크가 포함되어 있지 않음을 나타냅니다. 샘플 HDF5 파일의 내용을 더 자세히 살펴보려면 Groups의 구조체 중 하나를 검토하십시오. 다음 예제에서는 이 필드에 있는 두 번째 구조체의 내용을 보여줍니다.

level2 = info.Groups(2)
level2 = 

  struct with fields:

          Name: '/g2'
        Groups: []
      Datasets: [2×1 struct]
     Datatypes: []
         Links: []
    Attributes: []

샘플 파일에서 /g2라는 그룹에는 2개의 데이터셋이 포함되어 있습니다. 다음 그림에서는 샘플 HDF5 파일 구성 중 이 부분을 보여줍니다.

Schematic showing structure of HDF5 data in example.h5

데이터셋에 대한 정보(예: 이름, 차원, 데이터형)를 얻으려면 Datasets 필드에 반환된 구조체 중 하나를 살펴보십시오.

dataset1 = level2.Datasets(1)
dataset1 = 

  struct with fields:

          Name: 'dset2.1'
      Datatype: [1×1 struct]
     Dataspace: [1×1 struct]
     ChunkSize: []
     FillValue: []
       Filters: []
    Attributes: []

HDF5 파일에서 데이터 가져오기

HDF5 파일에서 데이터 또는 메타데이터를 읽어오려면 h5read 함수를 사용하십시오. 인수로는 HDF5 파일의 이름과 데이터셋의 이름을 지정합니다. (특성 값을 읽어오려면 h5readatt를 사용해야 합니다.)

설명을 위해 다음 예제에서는 HDF5 샘플 파일 example.h5에서 데이터셋 /g2/dset2.1을 읽어옵니다.

data = h5read("example.h5","/g2/dset2.1")
data =

  10×1 single column vector

    1.0000
    1.1000
    1.2000
    1.3000
    1.4000
    1.5000
    1.6000
    1.7000
    1.8000
    1.9000

HDF5 데이터형을 MATLAB 데이터형에 매핑하기

h5read 함수는 HDF5 파일의 데이터를 MATLAB 작업 공간으로 읽어올 때 아래 표에 표시된 것처럼 HDF5 데이터형을 MATLAB 데이터형에 매핑합니다.

HDF5 데이터형h5read 출력값

비트 필드

압축 8비트 정수로 구성된 배열

부동소수점

MATLAB single형과 double형(64비트 이하를 차지하는 경우)

정수형(부호 있는 정수와 부호 없는 정수)

상응하는 MATLAB 정수형(부호 있는 정수와 부호 없는 정수)

불투명

uint8형 값으로 구성된 셀형 배열

참조

참조의 값이 아니라 참조가 가리키는 실제 데이터로 구성된 셀형 배열

문자열(고정 길이와 가변 길이)

string형 배열

열거형

문자형 벡터로 구성된 셀형 배열(각 열거형 값은 대응하는 멤버 이름으로 바뀜)

복합형

1×1 구조체형 배열(데이터셋의 차원은 구조체의 필드에 표시됨)

배열

HDF5 배열과 동일한 데이터형의 값으로 구성된 배열. 예: 부호 있는 32비트 정수로 구성된 배열의 경우, MATLAB 배열의 유형은 int32임.

MATLAB에 포함된 예제 HDF5 파일에는 위의 모든 데이터형에 대한 예제가 포함되어 있습니다.

예를 들어, 데이터셋 /g3/string은 문자열입니다.

h5disp("example.h5","/g3/string")
HDF5 example.h5 
Dataset 'string' 
    Size:  2
    MaxSize:  2
    Datatype:   H5T_STRING
        String Length: 3
        Padding: H5T_STR_NULLTERM
        Character Set: H5T_CSET_ASCII
        Character Type: H5T_C_S1
    ChunkSize:  []
    Filters:  none
    FillValue:  '   '

이제 파일에서 데이터를 읽어오겠습니다. MATLAB은 이 데이터를 string형 배열로 반환합니다.

s = h5read("example.h5","/g3/string")
s = 

  2×1 string array

    "ab "
    "de "

복합형 데이터형은 항상 구조체로 반환됩니다. 데이터셋의 차원은 구조체 필드에 표시됩니다. 예를 들어, 데이터셋 /g3/compound2D는 복합형 데이터형입니다.

h5disp("example.h5","/g3/compound2D")
HDF5 example.h5 
Dataset 'compound2D' 
    Size:  2x3
    MaxSize:  2x3
    Datatype:   H5T_COMPOUND
        Member 'a':  H5T_STD_I8LE (int8)
        Member 'b':  H5T_IEEE_F64LE (double)
    ChunkSize:  []
    Filters:  none
    FillValue:  H5T_COMPOUND

이제 파일에서 데이터를 읽어오겠습니다. MATLAB은 이 데이터를 구조체로 반환합니다.

data = h5read("example.h5","/g3/compound2D")
data = 

  struct with fields:

    a: [2×3 int8]
    b: [2×3 double]

로우 레벨 HDF5 함수를 사용하여 데이터 가져오기

MATLAB은 HDF5 라이브러리의 함수에 대응하는 로우 레벨 함수를 사용하여 HDF5 라이브러리의 수십 가지 함수에 직접 액세스할 수 있도록 합니다. 이 방법을 통해 사용자는 MATLAB에서 HDF5 서브셋 설정 기능 사용, 복소수 데이터형 쓰기 같은 HDF5 라이브러리의 기능에 액세스할 수 있습니다. 자세한 내용은 Export Data Using MATLAB Low-Level HDF5 Functions 항목을 참조하십시오.

HDF5 파일에서 대화형 방식으로 데이터 읽어오기

이 예제에서는 데이터 가져오기 작업을 사용하여 HDF5 파일의 구조를 탐색하고 파일에서 데이터를 가져온 후 데이터를 분석하고 시각화하는 방법을 보여줍니다.

데이터 탐색 및 가져오기

이 예제에 포함된 HDF5 파일에는 NASA PPS(Precipitation Processing System)에서 가져온 강수 확률 추정값이 들어 있습니다.

라이브 편집기 탭에서 작업 > 데이터 가져오기를 선택하여 라이브 편집기에서 데이터 가져오기 작업을 엽니다. 파일 필드에 HDF5 파일의 이름 nasa_pps.h5를 입력합니다. 이 작업을 사용하여 그룹, 데이터셋, 특성을 포함해 데이터의 구조를 탐색할 수 있습니다. 파일에는 3개의 데이터셋이 포함된 그룹 S1이 있습니다. probabilityOfPrecip 데이터셋에는 지정된 위치의 강수 확률 추정값이 포함되어 있고, LatitudeLongitude 데이터셋에는 이러한 확률 추정값의 위치가 포함되어 있습니다. probabilityOfPrecip 데이터셋의 특성은 'percent' 값을 갖는 units를 포함합니다.

3개의 데이터셋에서 데이터와 특성을 선택하고 가져옵니다.

2023-12-07_09-19-16.png

이 작업이 생성하는 코드를 확인하려면 작업 파라미터 영역 맨 아래에 있는 코드 표시를 클릭하여 작업 표시 영역을 확장합니다.

% Create a structure to store imported HDF5 data
nasa_pps = struct();

filename = "nasa_pps.h5";

nasa_pps.Groups(1).Name = "S1";

nasa_pps.Groups(1).Datasets(1).Name = "Latitude";
nasa_pps.Groups(1).Datasets(1).Value = h5read(filename, "/S1/Latitude");

nasa_pps.Groups(1).Datasets(2).Name = "Longitude";
nasa_pps.Groups(1).Datasets(2).Value = h5read(filename, "/S1/Longitude");

nasa_pps.Groups(1).Datasets(3).Name = "probabilityOfPrecip";
nasa_pps.Groups(1).Datasets(3).Value = h5read(filename, "/S1/probabilityOfPrecip");

nasa_pps.Groups(1).Datasets(1).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(1).Attributes(1).Value = h5readatt(filename, "/S1/Latitude", "units");

nasa_pps.Groups(1).Datasets(1).Attributes(2).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(1).Attributes(2).Value = h5readatt(filename, "/S1/Latitude", "DimensionNames");

nasa_pps.Groups(1).Datasets(1).Attributes(3).Name = "Units";
nasa_pps.Groups(1).Datasets(1).Attributes(3).Value = h5readatt(filename, "/S1/Latitude", "Units");

nasa_pps.Groups(1).Datasets(1).Attributes(4).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(1).Attributes(4).Value = h5readatt(filename, "/S1/Latitude", "_FillValue");

nasa_pps.Groups(1).Datasets(1).Attributes(5).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(1).Attributes(5).Value = h5readatt(filename, "/S1/Latitude", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(2).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(2).Attributes(1).Value = h5readatt(filename, "/S1/Longitude", "units");

nasa_pps.Groups(1).Datasets(2).Attributes(2).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(2).Attributes(2).Value = h5readatt(filename, "/S1/Longitude", "DimensionNames");

nasa_pps.Groups(1).Datasets(2).Attributes(3).Name = "Units";
nasa_pps.Groups(1).Datasets(2).Attributes(3).Value = h5readatt(filename, "/S1/Longitude", "Units");

nasa_pps.Groups(1).Datasets(2).Attributes(4).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(2).Attributes(4).Value = h5readatt(filename, "/S1/Longitude", "_FillValue");

nasa_pps.Groups(1).Datasets(2).Attributes(5).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(2).Attributes(5).Value = h5readatt(filename, "/S1/Longitude", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(3).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(3).Attributes(1).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "units");

nasa_pps.Groups(1).Datasets(3).Attributes(2).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(3).Attributes(2).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "_FillValue");

nasa_pps.Groups(1).Datasets(3).Attributes(3).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(3).Attributes(3).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "DimensionNames");

nasa_pps.Groups(1).Datasets(3).Attributes(4).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(3).Attributes(4).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(3).Attributes(5).Name = "Units";
nasa_pps.Groups(1).Datasets(3).Attributes(5).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "Units");

clear filename

데이터를 구성하고 준비하기

콜론 연산자(:)를 사용하여 3개 데이터셋의 데이터를 열 벡터로 추출합니다.

lats = nasa_pps.Groups.Datasets(1).Value(:);
lons = nasa_pps.Groups.Datasets(2).Value(:);
probs = nasa_pps.Groups.Datasets(3).Value(:);

플로팅을 위해 데이터를 정리합니다. 이러한 3개 데이터셋의 유효한 인덱스는 다음 조건을 준수합니다.

  • probs의 값은 구간 [0, 100]에 있습니다.

  • lats의 값은 구간 [–90, 90]에 있습니다.

  • lons의 값은 구간 [–180, 180]에 있습니다.

논리형 인덱싱을 사용하여 3개 데이터셋에서 유효한 인덱스에 있는 값만 유지합니다. 이 단계에서는 유효하지 않은 위도 값과 경도 값뿐 아니라 확률 추정값의 유효하지 않은 백분율 값을 제거합니다.

isValid = 0<=probs & probs<=100 & abs(lats)<=90 & abs(lons)<=180;

probs = probs(isValid);
lats = lats(isValid);
lons = lons(isValid);

데이터 플로팅하기

데이터셋의 유효한 데이터에 대한 지리 밀도 플롯을 생성합니다. "더 따뜻한" 색일수록 더 높은 강수 확률을 나타냅니다.

g = geodensityplot(lats,lons,probs,FaceColor="interp");
geobasemap grayland
geolimits([-80 80],[-180 -90])
title("Probability of Precipitation vs. Location")
colormap turbo

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type densityplot.

출처

NASA Precipitation Processing System이 해당 웹사이트(https://gpm.nasa.gov/data/directory)를 통해 제공한 글로벌 강수 데이터.

동적으로 불러온 필터를 사용하여 HDF5 데이터셋 읽기

MATLAB은 동적으로 불러온 필터를 사용하여 HDF5 데이터셋의 읽기와 쓰기를 지원합니다. The HDF Group은 웹사이트의 Filters에 등록된 필터 목록을 유지합니다.

사용자 정의된 타사 필터를 사용하여 쓴 데이터셋을 읽으려면 다음 단계를 따르십시오.

  1. HDF5 필터 플러그인을 시스템에 공유 라이브러리 또는 DLL로 설치합니다.

  2. 플러그인의 로컬 설치를 가리키도록 HDF5_PLUGIN_PATH 환경 변수를 설정한 후 MATLAB을 시작합니다.

    • Windows®의 경우 — 시스템 속성 > 고급 > 환경 변수를 사용하여 환경 변수를 설정한 후 MATLAB을 시작합니다.

    • Linux®Mac의 경우 — 터미널에서 환경 변수를 설정한 후 같은 터미널에서 MATLAB을 시작합니다.

이러한 단계를 완료한 후에는 하이 레벨 또는 로우 레벨 MATLAB HDF5 함수를 사용하여 타사 필터로 압축된 데이터셋을 읽고 이에 액세스할 수 있습니다. 자세한 내용은 The HDF Group 웹사이트의 HDF5 Dynamically Loaded Filters 항목을 참조하십시오.

Linux 사용자만 해당: MATLAB HDF5 공유 라이브러리를 사용하여 필터 플러그인 재빌드하기

R2021b부터 경우에 따라, 핵심 HDF5 라이브러리 함수에 대한 콜백이 있는 필터 플러그인을 사용하는 Linux 사용자는 제품에 포함된 MATLAB HDF5 공유 라이브러리 /matlab/bin/glnxa64/libhdf5.so.x.x.x를 사용하여 플러그인을 재빌드해야 합니다. 이 버전의 공유 라이브러리를 사용하여 플러그인을 재빌드하지 않을 경우 정의되지 않은 동작부터 비정상적인 종료에 이르는 다양한 문제가 발생할 수 있습니다. 자세한 내용은 Build HDF5 Filter Plugins on Linux Using MATLAB HDF5 Shared Library or GNU Export Map을 참조하십시오.

참고 항목

도움말 항목