2

Linq を使用して微積分の外積計算を実行しようとしており、以下のコードのパターンを把握しようとしています。

static void Main(string[] args)
    {
        double[] a = { 1, -1, -1 };
        double[] b = {.5,1,.5};

        var cross = from x in a
                    from y in b
                    select new {x,y};
        List<double> LeftSide = new List<double>();

        foreach (var c in cross) {             
            Console.WriteLine("x = " + c.x + " y = " + c.y);
            double res = c.x * c.y;
            Console.WriteLine("");
            LeftSide.Add(res);
        }

        double i = LeftSide[5] - LeftSide[7];
        double j = LeftSide[2] - LeftSide[6];
        double k = LeftSide[1] - LeftSide[3];
        Console.WriteLine("("+ i + "i) - (" + j + "j) +(" + k + "k)"  );
        Console.ReadLine();
    }

a と b を交差結合したら、次の計算を実行する必要があります。

  double i = LeftSide[5] - LeftSide[7];
  double j = LeftSide[2] - LeftSide[6];
  double k = LeftSide[1] - LeftSide[3];

これは機能し、目的の出力が得られます。より効率的に記述できることがわかっています。正しい方向に向けるために、何か提案を探しています。

注: これは宿題の質問ではありませんが、Calculus III Cross Products に関連しています。私はCS専攻です

4

2 に答える 2

7

あなたはこの方法、方法、方法を複雑にしすぎています。(a0, a1, a2)ベクトルとの外積(b0, b1, b2)は です(a1 * b2 - a2 * b1, a2 * b0 - a0 * b2, a0 * b1 - a1 * b0)。したがって、それを計算するだけです:

double[] a = { 1.0, -1.0, -1.0 };         
double[] b = { 0.5,  1.0,  0.5 };
double[] cross = 
{ 
    a[1] * b[2] - a[2] * b[1], 
    a[2] * b[0] - a[0] * b[2], 
    a[0] * b[1] - a[1] * b[0]
};

これで、1 つのステートメントで完了です。LINQ を使用する必要はありません。

于 2012-02-04T15:01:44.097 に答える
5

次のステップで要素のシーケンスに変換するためだけに、要素crossのシーケンスとして定義しています。これは冗長です。次を使用してすぐに生成できます。{x,y}x*yLeftSide

double[] a = { 1, -1, -1 };
double[] b = { .5, 1, .5 };

var LeftSide =
    (
        from x in a
        from y in b
        select x * y
    ).ToArray();
于 2012-02-04T14:58:33.883 に答える