Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

matlab.io.datastore.sdidatastore 클래스

패키지: matlab.io.datastore

시뮬레이션 데이터 인스펙터 신호를 위한 데이터저장소

설명

matlab.io.datastore.sdidatastore 객체는 시뮬레이션 데이터 인스펙터에 기록된 신호 중 너무 커서 메모리에 들어가지 않는 신호에 대한 액세스를 제공합니다. sdidatastore 객체는 단일 신호 데이터를 참조합니다. read 메서드는 각 청크가 항상 메모리에 들어가도록 하는 청크별 방식으로 sdidatastore 객체에서 참조하는 신호 데이터를 불러옵니다. sdidatastore 객체를 사용하여 신호 데이터를 위한 tall형 타임테이블을 만들 수 있습니다. tall형 배열 사용에 대한 자세한 내용은 tall형 배열 항목을 참조하십시오.

참고

matlab.io.datastore.sdidatastore는 병렬 계산을 지원하지 않습니다. Parallel Computing Toolbox™ 라이선스가 있다면 matlab.io.datastore.sdidatastore에서 tall형 타임테이블을 생성하기 전에 mapreducer(0)을 사용하여 실행 환경을 로컬 MATLAB® 클라이언트로 설정합니다.

생성

ds = dsrObj.getAsDatastore(arg)는 검색 기준인 arg에서 선택한 Simulink.sdi.DatasetRef 객체의 신호에 대해 sdidatastoreds를 만듭니다. argSimulink.sdi.DatasetRef 객체 내에 있는 신호 중 원하는 신호에 대한 인덱스를 나타내는 정수로 지정하거나, 신호 이름을 포함하는 문자형 벡터로 지정할 수 있습니다.

ds = matlab.io.datastore.sdidatastore(signalID)는 지정된 signalID에 해당하는 신호에 대해 sdidatastoreds를 만듭니다.

입력 인수

모두 확장

Simulink.sdi.DatasetRef 객체에서 요소를 가져오는 데 사용하는 검색 기준입니다. 이름 기반 검색의 경우 arg를 문자형 벡터로 지정하십시오. 인덱스 기반 검색의 경우 arg는 원하는 요소의 인덱스를 나타내는 정수입니다.

예: 'MySignal'

예: 3

신호에 대해 시뮬레이션 데이터 인스펙터에서 생성한 숫자형 신호 식별자입니다. 한 신호를 포함하는 Simulink.sdi.Run 객체의 메서드를 사용하여 해당 신호에 대한 신호 ID를 가져오거나, Simulink.sdi.createRun 함수에서 반환하는 값으로 신호 ID를 가져올 수 있습니다.

속성

모두 확장

신호의 이름으로, 문자형 벡터로 지정됩니다.

예: 'My Signal'

sdidatastore와 연결된 Simulink.sdi.Signal 객체입니다. Signal 속성은 신호 데이터와 메타데이터에 대한 액세스를 제공합니다.

메서드

hasdata Determine if data is available to read
preview Return preview of data in sdidatstore
read Read a chunk of data from an sdidatastore
readall Read all data from an sdidatastore
reset Reset the read position

복사 의미 체계

핸들. 핸들 클래스가 복사 작업에 미치는 영향을 알아보려면 객체 복사를 참조하십시오.

예제

모두 축소

이 예제에서는 시뮬레이션 데이터 인스펙터 리포지토리에 신호를 위한 tall형 타임테이블을 만드는 방법을 보여줍니다. Simulink.sdi.Signal 객체를 사용하거나 먼저 신호에 대한 matlab.io.datastore.sdidatastore를 만들어 tall형 타임테이블을 만들 수 있습니다. matlab.io.datastore.sdidatastore를 사용하여 메모리에 들어가지 않는 신호의 신호 데이터를 단계적으로 읽고 처리할 수 있습니다. tall형 타임테이블은 백그라운드에서 데이터를 청크화하고 처리합니다. 일반적으로 메모리 내의 데이터를 사용하는 것과 비슷한 방식으로 tall형 타임테이블을 사용할 수 있습니다.

데이터를 만들고 신호 ID에 액세스하기

Simulink.sdi.Signal 객체를 사용하든 matlab.io.datastore.sdidatastore를 사용하든 tall형 타임테이블을 만들 때는 먼저 데이터를 만들고 관심 있는 신호의 신호 ID에 액세스하십시오. sldemo_fuelsys 모델은 모델을 시뮬레이션할 때 시뮬레이션 데이터 인스펙터 리포지토리로 스트리밍되는 신호를 기록하도록 구성됩니다.

open_system('sldemo_fuelsys')
sim('sldemo_fuelsys')

그런 다음, 시뮬레이션 데이터 인스펙터의 프로그래밍 인터페이스를 사용하여 관심 있는 신호의 신호 ID에 액세스합니다. 예를 들어, ego 신호에 액세스해 보겠습니다.

runCount = Simulink.sdi.getRunCount;
latestRunID = Simulink.sdi.getRunIDByIndex(runCount);
latestRun = Simulink.sdi.getRun(latestRunID);

egoSigID = latestRun.getSignalIDByIndex(7);

matlab.io.datastore.sdidatastore를 사용하여 tall형 타임테이블 만들기

일반적으로 tall형 타임테이블은 데이터저장소에서 지원됩니다. matlab.io.datastore.sdidatastore 객체를 만들어 시뮬레이션 데이터 인스펙터 리포지토리의 신호 데이터를 참조합니다.

egoDs = matlab.io.datastore.sdidatastore(egoSigID);

데이터저장소의 이름을 검사하여 예상한 신호가 맞는지 확인합니다.

egoDs.Name
ans = 
'fuel'

matlab.io.datastore.sdidatastore에서 tall형 타임테이블을 만들어 신호 데이터 처리에 사용합니다. Parallel Computing Toolbox™ 라이선스가 있다면 tall형 타임테이블을 만들기 전에 mapreducer를 사용하여 실행 환경을 로컬 MATLAB® 세션으로 명시적으로 설정해야 합니다. matlab.io.datastore.sdidatastore 객체는 병렬 계산을 지원하지 않습니다.

mapreducer(0);

egoTt = tall(egoDs)
egoTt =

  Mx1 tall timetable

         Time          Data 
    ______________    ______

    0 sec              1.209
    0.00056199 sec     1.209
    0.0033719 sec      1.209
    0.01 sec          1.1729
    0.02 sec          1.1409
    0.03 sec          1.1124
    0.04 sec          1.0873
    0.05 sec          1.0652
          :             :
          :             :

Simulink.sdi.Signal 객체를 사용하여 tall형 타임테이블 만들기

Simulink.sdi.Signal 클래스에는 직접 tall형 타임테이블을 만들 수 있는 메서드가 있으며, 이를 사용하면 자동으로 타임테이블이 생성되므로 사용자가 데이터저장소를 만드는 단계를 건너뛸 수 있습니다. 신호 ID를 사용하여 ego 신호의 Simulink.sdi.Signal 객체에 액세스합니다. 그런 다음, getTable 메서드를 사용하여 tall형 타임테이블을 만듭니다.

egoSig = Simulink.sdi.getSignal(egoSigID);

egoTt = egoSig.getAsTall
egoTt =

  Mx1 tall timetable

         Time          Data 
    ______________    ______

    0 sec              1.209
    0.00056199 sec     1.209
    0.0033719 sec      1.209
    0.01 sec          1.1729
    0.02 sec          1.1409
    0.03 sec          1.1124
    0.04 sec          1.0873
    0.05 sec          1.0652
          :             :
          :             :

tall형 타임테이블을 사용하여 신호 데이터 처리하기

tall형 타임테이블인 egoTt를 사용할 때 기본 데이터저장소는 데이터 청크를 읽고 tall형 타임테이블에 전달하여 처리합니다. 처리 후에는 데이터저장소와 tall형 타임테이블 모두 메모리에 데이터를 유지하지 않습니다. 또한, tall형 타임테이블은 여러 작업을 수행하는 경우 처리를 연기합니다. 예를 들어, 신호의 평균값을 계산해 보겠습니다.

egoMean = mean(egoTt.Data)
egoMean =

  tall double

    ?

gather 함수를 사용하여 변수를 평가하고 작업 공간에 변수의 값을 쓰거나, write 함수를 사용하여 디스크에 결과를 쓸 수 있습니다. gather를 사용하면 결과가 메모리에 들어가는지 확인해야 합니다.

egoMean = gather(egoMean)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 22 sec
Evaluation completed in 22 sec
egoMean = 1.3292

tall형 타임테이블에서 여러 작업을 수행할 때 각 단계의 결과 평가는 write 또는 gather를 사용하여 명시적으로 결과를 요청할 때까지 지연됩니다. MATLAB은 평가 중 tall형 타임테이블을 통해 발생하는 전달 횟수를 최적화하여 매우 큰 신호를 분석하는 데 드는 처리 시간을 크게 단축할 수 있습니다. tall형 배열 사용에 대한 자세한 내용은 메모리에 담을 수 없는 큰 데이터를 위한 tall형 배열 항목을 참조하십시오.

matlab.io.datastore.sdidatastore는 시뮬레이션 데이터 인스펙터 리포지토리의 신호 데이터를 참조합니다. 신호가 너무 커서 메모리에 들어가지 않는 경우 matlab.io.datastore.sdidatastore를 사용하여 데이터를 단계적으로 직접 처리하거나, 단계적 처리를 담당하는 신호에 대한 tall형 타임테이블을 만들 수 있습니다. 이 예제에서는 matlab.io.datastore.sdidatastore를 사용하여 데이터를 처리하는 방법을 보여줍니다.

신호를 위한 matlab.io.datastore.sdidatastore 만들기

여러 신호를 기록하도록 구성된 sldemo_fuelsys 모델을 시뮬레이션하여 시뮬레이션 데이터 인스펙터 리포지토리에 데이터를 만듭니다.

sim('sldemo_fuelsys')

시뮬레이션 데이터 인스펙터의 프로그래밍 인터페이스를 사용하여 신호의 신호 ID를 가져옵니다.

runCount = Simulink.sdi.getRunCount;

latestRunID = Simulink.sdi.getRunIDByIndex(runCount);

latestRun = Simulink.sdi.getRun(latestRunID);

speedSigID = latestRun.getSignalIDByIndex(4);

신호 ID를 사용하여 speed 신호의 matlab.io.datastore.sdidatastore를 만듭니다.

speedSDIds = matlab.io.datastore.sdidatastore(speedSigID);

데이터저장소의 내용 확인하기

matlab.io.datastore.sdidatastoreName 속성을 검사하여 예상한 데이터저장소와 일치하는지 확인합니다.

speedSDIds.Name
ans = 
'map'

preview 메서드를 사용하여 신호의 첫 번째 열 개의 샘플이 올바르게 보이는지 검사할 수도 있습니다.

speedSDIds.preview
ans=10×1 timetable
         Time          Data  
    ______________    _______

    0 sec               0.589
    0.00056199 sec    0.58772
    0.0033719 sec     0.58148
    0.01 sec          0.56765
    0.02 sec          0.54897
    0.03 sec          0.53264
    0.04 sec          0.51837
    0.05 sec          0.50594
    0.055328 sec          0.5
    0.055328 sec          0.5

matlab.io.datastore.sdidatastore를 사용하여 신호 데이터 처리하기

신호가 너무 커서 메모리에 들어가지 않는 경우 readData 메서드를 사용하여 시뮬레이션 데이터 인스펙터 리포지토리에서 데이터 청크를 읽어 들여 데이터를 단계적으로 처리할 수 있습니다. 전체 신호를 단계적으로 처리하기 위해 hasdata 메서드를 while 루프의 조건으로 사용합니다. 예를 들어, 최대 신호 값을 찾아보겠습니다.

latestMax = [];

while speedSDIds.hasdata
    
    speedChunk = speedSDIds.read;
    speedChunkData = speedChunk.Data;
    latestMax = max([speedChunkData; latestMax]);
    
end

latestMax
latestMax = 0.8897

읽기 작업을 수행할 때마다 read 메서드는 다음 읽기 작업의 시작을 위해 읽는 위치를 업데이트합니다. matlab.io.datastore.sdidatastore의 일부 또는 전체를 읽어 들인 후에는 읽어 들인 위치를 재설정하여 신호의 처음부터 다시 시작할 수 있습니다.

speedSDIds.reset

메모리에 있는 신호 데이터 처리하기

matlab.io.datastore.sdidatastore에서 참조하는 신호가 메모리에 들어가다면 read 메서드로 데이터를 단계적으로 읽어 들여서 처리하는 것이 아니라 readall 메서드를 사용하여 메모리에 있는 신호 데이터를 모두 읽어 들여서 처리할 수 있습니다. readall 메서드는 모든 신호 데이터가 포함된 timetable형을 반환합니다.

speedTimetable = speedSDIds.readall;

speedMax = max(speedTimetable.Data)
speedMax = 0.8897
R2017b에 개발됨