2012-02-04 66 views
2

我試圖執行使用LINQ演算跨產品計算,並試圖找出了下面的代碼模式: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(); 
    } 

一旦我CROSS JOIN A和B,我需要執行以下計算:

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

這工作,我得到所需的輸出,把我知道它可以更有效地寫。我正在尋找任何建議,指向正確的方向。

注意:這不是一個家庭作業問題,但與微積分三交叉產品有關。我是CS大學

+3

你更有效率的意思是什麼?短?更快?使用5-7,2-6和1-3(索引)的邏輯是什麼?爲什麼這些? – 2012-02-04 14:39:36

回答

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] 
}; 

然後你就完成了一個語句。沒有必要涉及LINQ。

4

您正在將cross定義爲{x,y}元素的序列,只是將其在下一步中轉換爲x*y元素的序列。這是多餘的;你可以生成你的LeftSide立即使用:

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

var LeftSide = 
    (
     from x in a 
     from y in b 
     select x * y 
    ).ToArray();