1

時系列を表すために ILNumerics を使用しています。

理想的には、すべてのデータをオブジェクト指向でカプセル化して、インスタンス変数とインスタンス メソッドを使用してそのような変数を処理したいと考えています。

いくつか質問がありますが、すべて、効率的な方法で、おそらくインスタンス変数として、クラスに ILArray を実装する最良の方法は何かに関連しています。関連するドキュメントを読み、以前の SO の例を確認しましたが、これらの問題に明示的に対処しているようには見えません。

最初: 「配列利用クラス」の Web サイトで提案されている例 [ソース: http://ilnumerics.net/ClassRules.html ] は、少なくとも ILNumerics 試用版と VS 2013 プロフェッショナル (.net 4.5) ではコンパイルされないようです。 . 何か不足していますか?

それとも、コードのこの部分が原因ですか:

public ILRetArray<double> A 
{
  get 
  { 
    // lazy initialization 
    if (m_a.IsEmpty) 
    {
       m_a.a = ILMath.rand(100,100); 
    }
  }
  set { m_a.a = value; }

returnステートメントがありませんか?

上記の例では、次のインスタンス メソッドを使用して m_a 配列を変更できます。

public void Do() 
{
    using (ILScope.Enter()) 
    {
       // assign via .a property only!
       m_a.a = m_a + 2; 
    }
}

ベクトルの特定のコンポーネントにアクセスするにはどうすればよいでしょうか: m_a[0] = 2.2; のようなものが必要だとします。これはメモリ管理の邪魔になりますか?

一般的な観察として、ILNumerics を使用する自然な方法は、Fortran (またはおそらく R/Matlab) でコードを記述する場合と同様に、静的メソッドを使用することであると思われます。これが、これまでの使用方法です。インスタンス変数として ILArray 型を持ち、関連するメソッドを持つクラス定義は、効率的で簡単である必要がありますか?

または、System 配列をインスタンス変数として採用し、静的メソッドのみを介して ILarray にインポート/エクスポートして配列操作を実行することをお勧めしますか? 私はこの道を避ける傾向があるか、できるだけ制限したいと思っています。

4

1 に答える 1

1

ドキュメント セクション「ILArray とクラス」が更新されました。ご指摘のとおり、サンプルコードに誤りがありました。

ILArray インスタンスをクラス メンバーとして変更する

ドキュメントで説明されている規則に従うと、すべての配列メンバーは ILArray (または ILLogical または ILCell) 型になります。これらの型は変更可能な型です。有効期間中は自由に変更できます。m_a[0] = 2.2;期待どおりに動作します。配列を完全に置き換えることもできます。

m_a.a = ILMath.rand(2,3,5);  

単純に配列に代入.a =するのではなく、配列のプロパティまたは.Assign()メソッドを使用することに注意してください。コンパイラは、配列を として宣言しているため、誤って代入することを防ぎますreadonly

このような変更は、メモリ管理とスムーズに連携します。

静的メソッドとクラス インスタンスの混合

関数 (ILScope ブロック、個別の入力パラメーター配列型、.a プロパティによる割り当て) とクラス (readonly ILArray<T>宣言、ILMath.localMember<T>初期化) の両方のルールに注意を払う限り、両方のスキームを自由に組み合わせることができます。両方の方法で機能し、不要になったすべてのメモリをすぐに再利用します。

System.Array の集中的な使用とILArray<T>反対側の使用を混在させると、不利な割り当てパターンにつながる可能性があります。一般に、System.Array から ILArray を作成するのは簡単です。System.Array は、ストレージ スキームに適合する場合 (つまり、1 次元の場合)、ILArray によって直接使用されます。しかし、その逆はあまり効率的ではありません。通常、これにはデータのコピーが含まれ、ILNumerics メモリ管理も効率的に機能しません。

そのため、ILArray などを使用することをお勧めします。ご覧のとおり、覚えておくべきルールがいくつかありますが、通常、それらはすぐに吸収できます。

于 2014-07-27T18:26:01.323 に答える