2012-02-04 2 views
2

Я пытаюсь выполнить расчет продукта Исчисление Cross с помощью 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(); 
    } 

После того, как я пересекаю присоединиться к а и б, мне нужно выполнить следующие расчеты:

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

Это работает и я получаю желаемый результат, поставить я знаю, что это можно записать более эффективно. Я ищу любые предложения, чтобы указать мне в правильном направлении.

Примечание: Это не вопрос о домашнем задании, а относится к перекрестным продуктам Calculus III. Я CS Major

+3

Что вы хотите сказать более эффективно? Более короткие? Быстрее? Какова логика использования 5-7, 2-6 и 1-3 (индексов)? Почему это? –

ответ

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(); 
Смежные вопросы