主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ファesc escル入出力用の新しい系统对象の作成

この例では2つの異なる系统对象を作成,使用して,MATLAB®に出入りするデータのストリーミングを簡単にする方法を説明します。その2とはTextFileReaderTextFileWriterです。

この例で説明するオブジェクトは,多くの現実的な使用例を扱います。また,オブジェクトは,より高度で特殊なタスクを実現するためにカスタマesc escズできます。

はじめに

系统对象は,matlab。系统から派生するmatlabクラスです。その結果、系统对象はすべて,以下の標準メソッドを含む共通のパブリックインターフェイスを継承します。

  • 设置-オブジェクトを初期化(通常はシミュレション開始時)

  • 重置-オブジェクトの内部状態をクリアし、既定の初期化後の状態に戻す

  • 释放-オブジェクト内部で使用されるリソス(メモリ,ハドウェア,os固有のリソス)を解放

新しい種類の系统对象を作成するときは,上記のすべてのメソッドに対して特定の実装を提供し,動作を決定します。

この例では、内部構造、および次の2の系统对象の使用にいて説明します。

  • TextFileReader

  • TextFileWriter

MATLABに出入りするデータをストリーミングするこれらの系统对象を作成するために,この例では,MATLABで使用可能な標準の低水準ファイルI / O関数(fscanf从文件中读および写入文件など)を使用します。こうした関数の使用に関する詳細の大半を抽象化することにより,ストリームデータの読み取りと書き込みをよりシンプルかつ効率的にすることを目的としています。

この例には、系统对象を作成する多数の高度なコンストラクターの使用が含まれています。系统对象の作成に関するより基本的な説明にいては,系统对象の作成を参照してください。

クラスTextFileReaderの定義

TextFileReaderクラスには,クラス定義,パブリックプロパティとプライベートプロパティ,コンストラクター,保護されたメソッド(matlab。系统基底クラスからオバラド),およびプラベトメソッドが含まれます。TextFileWriterクラスも同様の構造です。

クラス定義

クラス定義では,TextFileReaderクラスがmatlab。系统matlab.system.mixin.FiniteSourceの両方から派生することが記述されています。

classdef (StrictDefaults)TextFileReader < matlab。System & matlab. System .mix . finitesource
  • matlab。系统は必須であり,すべての系统对象の基底クラスです。

  • matlab.system.mixin.FiniteSourceは,このクラスが有限数のデタサンプルをも信号ソスであることを示しています。このタaapl . exe,通常のaapl . exe,通常のaapl . exe,通常の结束も公開されます。结束がtrueを返すのは,オブジェクトが使用可能なデ,タの終端に達した場合です。

パブリックプロパティ

パブリックプロパティは,特定のアプリケーションに合わせてオブジェクトの動作を調整するためにユーザーが変更できます。TextFileReaderには調整不可のパブリックプロパティが2つ(オブジェクトを最初に呼び出す前にのみ変更可能)と,調整可能なパブリックプロパティが4つあります。すべてのパブリックプロパティに既定値があります。ユ,ザ,による指定が他に何もない場合は,既定値が対応するプロパティに割り当てられます。

properties(不可调)Filename = 'tempfile.txt' HeaderLines = 4结束
properties DataFormat = '%g'分隔符= ',' SamplesPerFrame = 1024 PlayCount = 1结束

プラ▪▪ベ▪▪トプロパティ

プラベトプロパティはユザには表示されず,以下を含む複数の目的を果たすことができます。

  • 計算される頻度が低く,後続するアルゴリズムの呼び出しで使用される値を保持する。たとえば,初期化時,设置が呼び出されたとき,またはオブジェクトが初めて呼び出されたときに使用される値です。これにより,実行時の再計算が不要になり,コア機能のパフォ,マンスが改善します。

  • オブジェクトの内部状態を定義する。たとえば,pNumEofReachedは,ファ。

properties(Access = private) pFID = -1 pNumChannels pLineFormat pNumEofReached = 0 end

コンストラクタ

コンストラクタ,は,名前と値のペアを使用してTextFileReaderオブジェクトを構築できるように定義されています。コンストラクタ,は,TextDataReaderの新しい@ @ンスタンスが作成されたときに呼び出されます。コンストラクタ,内でを呼び出すと,構築時に名前と値のペアでプロパティを設定できます。コンストラクタ,内では、その他の初期化タスクを指定してはなりません。代わりに、setupImplメソッドを使用します。

方法函数obj = TextFileReader(varargin) setProperties(obj, nargin, varargin{:});结束结束

matlab。系统基底クラスの保護されたメソッドのオバラド

すべての系统对象に共通するパブリックメソッドにはそれぞれ対応する保護されたメソッドがあり,これらは内部で呼び出されます。これらの保護されたメソッドの名前には,すべてImplという接尾辞が含まれます。これらは、系统对象の動作をプログラムするためのクラスを定義する際に実装できます。

標準的なパブリックメソッドとそれらの内部実装の対応関係の詳細にいては,呼び出しシ,ケンスの概要を参照してください。

たとえば,TextFileReaderは,以下のImplメソッドをオバラドします。

  • setupImpl

  • resetImpl

  • stepImpl

  • releaseImpl

  • isDoneImpl

  • processTunedPropertiesImpl

  • loadObjectImpl

  • saveObjectImpl

プラ▪▪ベ▪▪トメソッド

プラ。残りのコ,ドを読み取りやすくするために使用できます。クラスのさまざまな部分で複数回使用される個別のルーチン コード別にグループ分けすることにより、コードを再利用しやすくすることもできます。TextFileReaderの場合,プラ。

  • getWorkingFID

  • goToStartOfData

  • peekCurrentLine

  • lockNumberOfChannelsUsingCurrentLine

  • readNDataRows

デ,タの読み取りと書き込み

この例では,次を行うことによってTextFileReaderTextFileWriterの使用方法を説明します。

  • TextFileWriterを使用して,2の異なる正弦波信号のサンプルを含むテキストファ

  • TextFileReaderを使用してテキストファ@ @ルから読み取り

単純なテキストファ@ @ルの作成

周波数が50hzと60hzの2の正弦波信号を保存する新しいファルを作成します。各信号について,保存されるデータはサンプリングレートが800千赫の個のサンプルで構成されます。

デ,タサンプルを作成します。

Fs = 8000;Tmax = 0.1;T = (0:1/fs:tmax-1/fs)';N =长度(t);F = [50,60];数据= sin(2*pi*t*f);

将来使用するために,デ,タを分かりやすく説明するヘッダ,文字列を形成します(オプションの手順)。

Fileheader = sprintf([“以下包含两个的%d个样本”...频率为%d Hz和%d Hz,采样率为'...' %d kHz\n\n'], N, f(1),f(2),fs/1000);

信号をテキストファ电子邮箱ルに保存するために,TextFileWriterオブジェクトを作成します。TextFileWriterのコンストラクターには,ターゲットファイルの名前と,いくつかのオプションのパラメーターが必要です。これらは名前と値のペアとして渡すことができます。

TxtWriter = TextFileWriter(“文件名”“sinewaves.txt”“头”fileheader)
TxtWriter = TextFileWriter属性:文件名:'sinewaves.txt'头:'以下包含两个正弦信号的800个样本,…'DataFormat:“%。18g'分隔符:','

TextFileWriterは,区切り記号のあるASCIIファルにデタを書き込みます。そのパブリックプロパティには以下が含まれます。

  • 文件名-書き込まれるファie浏览器ルの名前。この名前のファaapl . exeルが既に存在する場合,既存のファaapl . exeルは上書きされます。操作が開始されると,オブジェクトはファ。オブジェクトはその後,解放されるまでの間,後続の呼び出しがあるたびに新しいデ,タを追加します。重置を呼び出すと、ファ和ルの最初から書き込みが再開されます。

  • -文字列。多くの場合,複数行で構成され,改行文字(\ n)で終了します。ユーザーによって指定され,実際のデータを説明する,人間が判読可能な情報を組み込み,変更することができます。

  • DataFormat—各デタサンプルの保存形式。組み込みのmatlab関数で使用されるformatSpec字符串内で変換指定子として割り当て可能な任意の値を使用できます。DataFormatは,ファ。このプロパティの既定値は“% .18g”です。この値を指定すると,倍精度の浮動小数点デ,タを完全精度で保存できます。

  • 分隔符-同じ時点のさまざまなチャネルからのサンプルを分離するために使用する文字。書き込まれたファイルの各行がそれぞれ1つの時点にマッピングされ,入力として指定されているチャネル数(つまり,オブジェクトに渡される行列入力の列数)と同数のサンプルを含みます。

使用可能なすべてのデタをファルに書き込むには,単一の呼び出しを使用できます。

TxtWriter(数据)

関数释放を呼び出して,ファ。

发行版(TxtWriter)

これでデタは新しいファルに保存されました。ファesc escルを視覚的に検査するには,次のように入力します。

编辑(“sinewaves.txt”

ヘッダ,が3行を占めるため,デ,タは4行目から始まります。

この単純なケ,スでは,信号全体の長さが小さく,システムメモリに十分に収まります。したがって,デ,タはすべて一度に作成し,単一の手順でファ,ルに書き込むことができます。

この方法が不可能な場合や現実的でない場合もあります。たとえば,データが大きすぎて単一の MATLAB 変数に収まらない (大きすぎてシステム メモリに収まらない) 場合などです。あるいは、データがループで周期的に作成されたり、外部ソースから MATLAB にストリーミングされる場合もあります。これらすべてのケースで、ファイルへのデータのストリーミングは、次の例と同様の方法で行うことができます。

ストリ,ミングされた正弦波発生器を使用して,ル,プごとのデ,タのフレ,ムを作成します。必要な回数繰り返し実行してデタを作成し,ファルに保存します。

frameLength = 32;Tmax = 10;T = (0:1/fs:tmax-1/fs)';N =长度(t);数据= sin(2*pi*t*f);numCycles = N/frameLength;K = 1:10当你用numCycles替换10时,%长时间运行的循环。dataFrame = sin(2*pi*t*f);TxtWriter (dataFrame)结束发行版(TxtWriter)

既存のテキストファ@ @ルからの読み取り

テキストファ电子邮箱ルから読み取るには,TextFileReaderの@ @ンスタンスを作成します。

TxtReader = TextFileReader(“文件名”“sinewaves.txt”“HeaderLines”3,“SamplesPerFrame”frameLength)
TxtReader =具有属性的TextFileReader:文件名:'sinewaves.txt' HeaderLines: 3 DataFormat: '%g'分隔符:',' SamplesPerFrame: 32 PlayCount: 1

TextFileReaderは,区切り記号のあるASCIIファルから数値デタを読み取ります。そのプロパティはTextFileWriterのものと類似しています。相違点は次のとおりです。

  • HeaderLines- - - - - -文件名で指定されているファ▪▪ル内でヘッダ▪▪が使用する行数。オブジェクトに対する最初の呼び出しは,行番号HeaderLines + 1から読み取りを開始します。オブジェクトに対する後続の呼び出しは,その前に読み取った行の直後の行から読み取りを継続します。重置を呼び出すと,HeaderLines + 1行目から読み取りを再開します。

  • 分隔符-同じ時点のさまざまなチャネルからのサンプルを分離するために使用する文字。このケースでは,区切り記号は,ファイルに保存されているデータチャネルの数を特定する目的でも使用されます。オブジェクトが最初に実行されると,オブジェクトはHeaderLines + 1行目の分隔符文字の数,たとえばnumDelをカウントします。次に,時点ごとに,オブジェクトはnumChan = numDel+1の数値をDataFormatの形式で読み取ります。アルゴリズムによって返される行列のサ@ @ズはSamplesPerFramenumChan列となります。

  • SamplesPerFrame-オブジェクトに対する各呼び出しで読み取られる行数。この値は,出力として返される行列の行数でもあります。使用可能な最後のデ,タ行に達したとき,必要なSamplesPerFrameに満たない場合があります。その場合は,使用可能なデ,タをゼロでパディングして,SamplesPerFramenumChan列のサ@ @ズの行列を取得します。すべてのデ,タが読み取られると,アルゴリズムは,重置または释放が呼び出されるまで,単純に0 (SamplesPerFrame numChan)を返します。

  • PlayCount—ファaapl . cerル内のデ. cerタが周期的に読み取られる回数。オブジェクトがファaapl . exeルの最後に達しても,ファaapl . exeルの読み取り回数がPlayCountに等しい数に達していない場合は,デ,タの最初(HeaderLines + 1行目)から読み取りが再開されます。ファ电子邮箱ルの最後の数行で,SamplesPerFramenumChan列のサイズの完全な出力行列を十分に形成できるサンプルが提供されていない場合,フレームは初期データを使用して完了します。このファ@ @ルがPlayCount回読み取られると,アルゴリズムによって返される出力行列はゼロで埋められ,重置または释放が呼び出されない限り,结束に対するすべての呼び出しは真实を返します。使用可能なデ,タを無限にル,プするには,PlayCountに設定できます。

テキストファルからデタを読み取るには,より一般的なストリミングの方法を使用します。このデタの読み取り方法は,非常に大きいデタファルを処理する場合にも適しています。frameLength行2列のデタフレムを事前に割り当てます。

数据帧= 0 (frameLength,2,“单一”);

ソーステキストファイルにデータが存在する状態で,テキストファイルから読み取ってバイナリファイルに書き込みます。メソッド结束を使用して,ル,プの実行を制御する方法に注目してください。

(~isDone(TxtReader)) dataFrame(:) = TxtReader();结束发行版(TxtReader)

まとめ

この例では、系统对象を作成,使用して,数値データファイルの読み取りと書き込みを行う方法を説明しました。TextFileReaderTextFileWriterを編集して,特殊用途のファ。これらのカスタム系统对象を,dsp。BinaryFileWriterdsp。BinaryFileReaderのような組み込みの系统对象と組み合わせることもできます。

カスタムアルゴリズム用の系统对象の作成の詳細にいては,系统对象の作成を参照してください。

関連するトピック