Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / [Linq] посчитать сумму произведений массива / 9 сообщений из 9, страница 1 из 1
03.04.2009, 10:28
    #35909950
bbbdum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
как проще посчитать такое
Код: plaintext
1.
2.
3.
4.
var a = new double[5]
var и = new double[5]
for(int i=0;i<a.Length,i++)
yield return a[i]*b[i];
на линке первое, что пришло в голову, выглядит так

Код: plaintext
1.
2.
int i=0;
a.Aggregate(0,(sum,item)sum+item*b[i++]);
как можно без лишней переменной (i) посчитать сумму произведений кажого элемента массива?
...
Рейтинг: 0 / 0
03.04.2009, 11:10
    #35910096
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
exp(sum(log(value)) ?
...
Рейтинг: 0 / 0
03.04.2009, 11:11
    #35910099
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
Ой... не дочитал :)
...
Рейтинг: 0 / 0
03.04.2009, 12:02
    #35910285
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
Код: plaintext
1.
A.Select((a,i)=>a*B[i]).Sum()

Это те же яйца, но лаконичнее, и нет внешней переменной.

А вот метод для взрослых, будет работать для любых IEnumerable, не только с индексом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
[TestMethod]
		public void TestMethod1()
		{
			// setup
			var A = new [] {1, 3, 1};
			var B = new[] {2, 1, 5};

			// act
			var actual = JoinByPosition(A, B, (a, b) => a*b).Sum();
					
			// assert
			Assert.AreEqual(10, actual);
		}
		
		
		public IEnumerable<TResult> JoinByPosition<Ta,Tb, TResult>(IEnumerable<Ta> qa, IEnumerable<Tb> qb, Func<Ta,Tb,TResult> makePair)
		{
			using (var ia = qa.GetEnumerator())
			using (var ib = qb.GetEnumerator())
				while (ia.MoveNext() && ib.MoveNext())
					yield return makePair(ia.Current, ib.Current);
		}

нет дурацких вопросов, есть дурацкие ответы
...
Рейтинг: 0 / 0
03.04.2009, 12:42
    #35910438
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
Еще есть замечательный Range, который заменяет for(;;)

Код: plaintext
Enumerable.Range(0,N).Select(i=>A[i]*B[i]).Sum()

Это лучше for хотябы тем, что можно сделать

Код: plaintext
ParallelEnumerable.Range(0,N).Select(i=>A[i]*B[i]).Sum()

При больших N у меня получилось больше чем в 2 раза быстрее на CoreDuo
Этот факт я не могу объяснить - возможно ParallelEnumerable как-то сильно оптимизирован, помимо того, что работает в несколько ниток.

нет дурацких вопросов, есть дурацкие ответы
...
Рейтинг: 0 / 0
03.04.2009, 13:25
    #35910598
bbbdum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
gp,

Enumerable.Range долго писать, я бы предпочет что -нибудь в таком стиле

repeater(N,i=>a[i]*b[i]) или вообще так rep(N){sum+=a[i]*b[i];}
...
Рейтинг: 0 / 0
03.04.2009, 14:42
    #35910815
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
Напишите свое расширение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public static class ScalarSequenceExtensions
{
 public static double SumAll(this int N, Func<int,double> elt)
 {
   Enumerable.Range(0, N).Select(i=>elt(i)).Sum();
 }
}

N.SumAll(i=>a[i]*b[i]);


А по поводу краткости - фигней не страдайте, потренеруйтесь печатать.


нет дурацких вопросов, есть дурацкие ответы
...
Рейтинг: 0 / 0
03.04.2009, 14:43
    #35910816
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
сори - return забыл

нет дурацких вопросов, есть дурацкие ответы

Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
05.04.2009, 14:55
    #35912869
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linq] посчитать сумму произведений массива
Я конечно, извиняюсь, но это никакого отношения к
ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM
не имеет.

Видимо, следовало назвать форум
ADO.NET, LINQ to SQL, Entity Framework, NHibernate, DAL, ORM

А топик чисто C#

нет дурацких вопросов, есть дурацкие ответы
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / [Linq] посчитать сумму произведений массива / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]