5

MATREAD と READ の違いを理解する必要がありますか? また、どこでどのように使用するかについての簡単な例を提供してください。

4

2 に答える 2

9

READディスクからレコードを読み取り、それを として返しDynamic Arrayます。 MATREADディスクからレコードを読み取り、それを として返しDimensioned Arrayます。

したがって、本当の秘訣は、どの配列タイプがユースケースにより適しているかを判断することです。

ADynamic Arrayは基本的に、特定のバイト マーカーを使用して各要素 (属性/複数値/サブ値) を区切る文字列です。非常に使いやすく、事前の宣言やサイズ変更は必要ありません。欠点としてDimensioned Array、主に大きなレコードの場合、または配列から属性をランダムに取得する場合は、 a よりも遅くなる可能性があります - O(n log n) だと思います。シーケンシャル アクセスが最適化され、Dimensioned Arrays速度に近づきます。

ADimensioned Arrayは基本的に文字列の配列です (またはDynamic ArraysUniVerse の場合)。各属性を配列位置に読み取ります。各配列位置はDynamic Array、その属性の複数値/部分値位置のみで構成されます。Dimensioned Arraysそれらと配列位置の数を前もって宣言する必要がありました。実行しているフレーバーによっては、配列のサイズよりも多くの属性を持つレコードを読み込もうとすると、実行時エラーが発生する場合があります。反対に、アクセスパターンに関係なく、配列から属性を取得するのは O(1) です。

于 2013-05-13T13:25:30.390 に答える
2

MATREADU は MATPARSE を READ にバンドルします。これらは、動的配列の属性を次元配列または固定配列に吹き込みます。これは、配列に頻繁にアクセスする場合はより効率的であり、DICtionary から I 型を読み取る場合はより便利です。READV は、1 つの配列属性のみを読み取ります。明確さを目指し、必要に応じて最適化します。

同じ出力を生成する 4 行の UniVerse の例を次に示します。

dim dimarr1(9), dimarr2(9)                                      
open 'VOC' else abort                                           
matread dimarr1 from 'OLDSTYLE' then print dimarr1(1) else abort
read dynarr from 'OLDSTYLE' then print dynarr<1> else abort     
matparse dimarr2 from dynarr ; print dimarr2(1)                 
readv dynatt from 'OLDSTYLE', 1 then print dynatt else abort    
end 
于 2013-05-13T15:12:49.510 に答える