0

4つの二重列で構成されるリストがあります

class MainE
{
     class cPoint
    {
        public double a;
        public double b;
        public double c;
        public double d;
    };

static void Main()
{
    List<cPoint> lst = new List<cPoint>();
    lst .Add(new cPoint(){a =613, b = 261, c=163,d=345 });
    lst .Add(new cPoint(){a =271, b = 251, c=363,d=444 });
    lst .Add(new cPoint(){a =181, b = 232, c=473,d=643 });
    lst .Add(new cPoint(){a =411, b = 322, c=643,d=742 });
    lst .Add(new cPoint(){a =542, b = 225, c=853,d=141 });
    lst .Add(new cPoint(){a =661, b = 242, c=293,d=241 });
    lst .Add(new cPoint(){a =771, b = 232, c=143,d=243 });
    lst .Add(new cPoint(){a =481, b = 212, c=353,d=444 });
    lst .Add(new cPoint(){a =681, b = 214, c=233,d=514 });
    lst .Add(new cPoint(){a =613, b = 241, c=123,d=355 });
    lst .Add(new cPoint(){a =271, b = 451, c=363,d=444 });
    lst .Add(new cPoint(){a =171, b = 232, c=463,d=743 });
    lst .Add(new cPoint(){a =419, b = 362, c=653,d=782 });
    lst .Add(new cPoint(){a =142, b = 227, c=853,d=149 });
    lst .Add(new cPoint(){a =661, b = 282, c=943,d=241 });
    lst .Add(new cPoint(){a =721, b = 282, c=444,d=343 });
    lst .Add(new cPoint(){a =482, b = 292, c=323,d=424 });
    lst .Add(new cPoint(){a =641, b = 219, c=123,d=514 });

}

}

式を適用して元のリストから2つのリストを作成したい(ここではベクトル用に書かれています):

1 つのリストでは、元のリストの各列に次の式を適用する必要があります

for (i = 1; i < N - 1; ++i)
{
    output[i] = (input[i - 1] + input[i] + input[i + 1]) / 3;
}

2番目のリストは、元のリストの各列に次の式を適用する必要があります

for (i = 1; i < N ; ++i)
{
    output[i] = input[i] - input[i - 1];
}

ここでの問題は、リスト内の前の要素と次の要素を取得する方法と、リストの2番目の要素から開始して最後の要素の前で終了する方法がわからないことです...

元のリストの各列に各数式を適用する方法は?

4

2 に答える 2

2

クラスにを定義できますindexercPoint

class cPoint {
    static cPoint(){
      //We just care about the Fields of type double
      fields = typeof(cPoint).GetFields().Where(f=>f.FieldType==typeof(double)).ToArray();
      ColumnCount = fields.Length;
    }
    static FieldInfo[] fields;
    public static int ColumnCount {get;private set;}
    public double a;
    public double b;
    public double c;
    public double d;
    public double this[int index]{
       get {
          return (double)fields[index].GetValue(this);
       }
       set {
          fields[index].SetValue(this, value);
       }
    }
}

var list1 = lst.Select(x=> {                    
                cPoint output = new cPoint();
                output[0] = x[0];
                for(int i = 1; i < x.ColumnCount-1; i++){
                   output[i] = (x[i - 1] + x[i] + x[i + 1]) / 3;
                }
                return output;
            }).ToList();
var list2 = lst.Select(x=> {
                cPoint output = new cPoint();
                output[0] = x[0];
                for(int i = 1; i < x.ColumnCount; i++){
                   output[i] = x[i] - x[i - 1];
                }
                return output;
            }).ToList();

: この方法を使用すると、パフォーマンスが低下する可能性があるため、順番internal listに公開するためにいくつかを定義する必要があります。ただし、ここで使用する利点は、フィールドを簡単に追加または削除できることです。必要な順序でフィールドを定義するだけです。フィールドを定義する順序は、for ループでループする列の順序とまったく同じですColumnsReflectionReflection

于 2013-09-20T08:16:35.650 に答える
1

インデクサーを配置するための代替アプローチcPoint

    class cPoint
    {
        private readonly double[] values = new double[4];

        public double this[int index] {
            get { return values[index]; }
            set { values[index] = value; }
        }

        public int Length
        {
            get { return values.Length; }
        }

        public double a
        {
            get { return this[0]; }
            set { this[0] = value; }
        }
        public double b
        {
            get { return this[1]; }
            set { this[1] = value; }
        }
        public double c
        {
            get { return this[2]; }
            set { this[2] = value; }
        }
        public double d
        {
            get { return this[3]; }
            set { this[3] = value; }
        }
    };
于 2013-09-20T08:37:20.817 に答える