Eвклидова норма вектора с помощью метода Parallel.For и Parallel.Invoke - C#

Узнай цену своей работы

Формулировка задачи:

Имеется прога (евклидова норма вектора) Преобразовать её, чтобы распараллеливание шло методом методом Parallel.For и Parallel.Invoke
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Evklid
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. var vector = new double[] { 2, 3, 4, 5, 6 }; // Вектор
  13. var taskCount = 3; //Число параллельных задач
  14. var sum = CalculateSum(vector, taskCount); //Параллельный подсчет суммы
  15. var norm = Math.Sqrt(sum);
  16. Console.WriteLine("Сумма квадратов: " + sum + "; Норма вектора: " + norm);
  17. Console.ReadKey();
  18. }
  19. private static double CalculateSum(double[] vector, int taskCount)
  20. {
  21. var len = vector.Length;
  22. //Не может быть задач больше числа элементов вектора
  23. if (taskCount > len)
  24. throw new ArgumentException();
  25. var step = (len + 1) / taskCount; //Интервал для суммы
  26. var tasks = new Task<double>[taskCount];
  27. for (var i = 0; i < taskCount; i++)
  28. {
  29. tasks[i] = Task<double>.Factory.StartNew((obj) => Sum(vector, (int)obj * step, ((int)obj + 1) * step - 1), i);
  30. }
  31. Task.WaitAll(tasks);
  32. var sum = tasks.Select(x => x.Result).Sum();
  33. return sum;
  34. }
  35.  
  36. static double Sum(IEnumerable<double> vector, int index1, int index2)
  37. {
  38. index2 = index2 >= vector.Count() ? vector.Count() : index2;
  39. return vector.Skip(index1).Take(index2 - index1 + 1).Select(x => x * x).Sum();
  40. }
  41. }
  42. }

Решение задачи: «Eвклидова норма вектора с помощью метода Parallel.For и Parallel.Invoke»

textual
Листинг программы
  1.         static void Main(string[] args)
  2.         {
  3.             var vector = new double[] { 2, 2, 2, 2, 2 }; // Вектор
  4.             var sum = 0.0;
  5.             Parallel.ForEach(vector,
  6.                 () => // Initializer
  7.                 {
  8.                     return 0.0;
  9.                 },
  10.                 (item, state, subtotal) => // Loop body
  11.                 {
  12.                     return subtotal += item*item;
  13.                 },
  14.                 (subtotal) => // Accumulator
  15.                 {
  16.                     lock (vector)
  17.                     {
  18.                         sum += subtotal;
  19.                     }
  20.                 });
  21.            
  22.             var norm = Math.Sqrt(sum);
  23.             Console.WriteLine("Сумма квадратов: "+sum+"; Норма вектора: "+norm);
  24.             Console.ReadKey();
  25.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы