では変換することはできC#double[,,]配列double[]コピーを作らずに

StackOverflow https://stackoverflow.com/questions/96054

  •  01-07-2019
  •  | 
  •  

質問

私は大きな3D配列番号する事純ます。I変換する必要があるし、1次元配列通しCOM図書館があります。があるので、変換する配列のコピーを作らずにすべてのデータはもらえますか?

がんの転換がもらかにしていきたいと考えていをammountのメモリにおける課題の一つである私の申し込み:

  double[] result = new double[input.GetLength(0) * input.GetLength(1) * input.GetLength(2)];
  for (i = 0; i < input.GetLength(0); i++) 
    for (j = 0; j < input.GetLength(1); j++) 
      for (k = 0; k < input.GetLength(2); k++) 
        result[i * input.GetLength(1) * input.GetLength(2) + j * input.GetLength(2) + k)] = input[i,j,l];
  return result;
役に立ちましたか?

解決

とは思っていない方C#る店舗データ記憶ということなので実現可能な同じように簡単にキャストCするパラメータである。なぜ使用しないで1次元配列するのかクラスのタイプなのでアクセスできるプログラムまたは3次元配列には?

他のヒント

残念ながら、C#の配列でな保証する連続したメモリのようにも近く、金属の言語のようなC.います。が変換するdouble[,,】double[]な要素による要素をコピーします。

検討の抄録データへのアクセスと プロキシ (反復子は、スマート-ポインタはC++).残念ながら、文法などクリーンとしてのC++としてのオペレーター()な過負荷およびオペレーター[】シングル-argがあります。

もちろん、このレベルの抽象化に加え複雑な作業ができる最小限の変更は、既存のコードを使用するdouble[,,]物できるので、モーバイルコンピューティングdouble[]配列の両方のinteropとにC#の計算である。

class Matrix3
{
    // referece-to-element object
    public struct Matrix3Elem{
        private Matrix3Impl impl;
        private uint dim0, dim1, dim2;
        // other constructors
        Matrix3Elem(Matrix3Impl impl_, uint dim0_, uint dim1_, uint dim2_) {
            impl = impl_; dim0 = dim0_; dim1 = dim1_; dim2 = dim2_;
        }
        public double Value{
            get { return impl.GetAt(dim0,dim1,dim2); }
            set { impl.SetAt(dim0, dim1, dim2, value); }
        }
    }

    // implementation object
    internal class Matrix3Impl
    {
        private double[] data;
        uint dsize0, dsize1, dsize2; // dimension sizes
        // .. Resize() 
        public double GetAt(uint dim0, uint dim1, uint dim2) {
            // .. check bounds
            return data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ];
        }
        public void SetAt(uint dim0, uint dim1, uint dim2, double value) {
            // .. check bounds
            data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ] = value;
        }
    }

    private Matrix3Impl impl;

    public Matrix3Elem Elem(uint dim0, uint dim1, uint dim2){
        return new Matrix2Elem(dim0, dim1, dim2);
    }
    // .. Resize
    // .. GetLength0(), GetLength1(), GetLength1()
}

そしてこのタイプの両方の読み書き--'foo[1,2,3]'は今、"foo.Elem(1,2,3).価値は、読み値の書き値を、左側の値表現です。

void normalize(Matrix3 m){

    double s = 0;
    for (i = 0; i < input.GetLength0; i++)     
        for (j = 0; j < input.GetLength(1); j++)       
            for (k = 0; k < input.GetLength(2); k++)
    {
        s += m.Elem(i,j,k).Value;
    }
    for (i = 0; i < input.GetLength0; i++)     
        for (j = 0; j < input.GetLength(1); j++)       
            for (k = 0; k < input.GetLength(2); k++)
    {
        m.Elem(i,j,k).Value /= s;
    }
}

再び、開発コスト、株式データの消去、架複製、コピー関連developtmentます。このトレードオフ.

回避策として作成でき、クラスの配列の一元的な形状をもでも近くに金属素形うにすることで渡すことができ簡単にCOMのですか?) その過負荷のオペレーター[]このクラスで使用可能としての多次元配列あるいはC#のコードです。

ることを知らずの詳細をビルトインデータベース図書館、私見をファサードのクラスです。純射すCOMが必要です。
おファサードがダブル[,,】としてindexerる地図から[]を[,,].

編集:いつのポイントのコメントLorens提案があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top