Численно добавить значения двух векторов, используя Math.Net Numerics с C#
У меня есть два вектора, как следующие:
vdA = { 8.0, 7.0, 6.0 }
vdB = { 0.0, 1.0, 2.0, 3.0 }
Я в основном хочу вектор vdX, результатом которого является суммирование всех элементов vdA по всем значениям vdB.
vdX = {
8.0, 9.0, 10.0 11.0,
7.0, 8.0, 9.0, 10.0,
6.0, 7.0, 8.0, 9.0
}
С MathNet.Numerics я не мог найти функцию для этого.
В C# я делаю этот код, чтобы сделать это
Vector<double> vdA = new DenseVector(new[] { 8.0, 7.0, 6.0 });
Vector<double> vdB = new DenseVector(new[] { 0.0, 1.0, 2.0, 3.0 });
List<double> resultSumVector = new List<double>();
foreach (double vectorValueA in vdA.Enumerate())
foreach (double vectorValueB in vdB.Enumerate())
resultSumVector.Add(vectorValueA + vectorValueB);
Vector<double> vdX = new DenseVector(resultSumVector.ToArray());
Есть ли другие варианты, чтобы сделать это быстрее с Math.Net Numerics в C#?
1 ответ
Решение
Вам в основном нужно перекрестное соединение в Linq. Вы можете написать метод расширения, который выглядит так, как будто это метод Math.Net:
namespace MathNet.Numerics
{
public static class DenseVectorExtensions
{
public static DenseVector AddAlls(this DenseVector vdA, DenseVector vdB)
{
return DenseVector.OfEnumerable(
vdA.SelectMany(x => vdB, (y, z) => { return y + z; })
);
}
}
}
Использование:
var vdA = new DenseVector(new[] { 8.0, 7.0, 6.0 });
var vdB = new DenseVector(new[] { 0.0, 1.0, 2.0, 3.0 });
var vdX = vdA.AddAlls(vdB);
Это не особенно быстро.