2013-10-23 92 views
2

值我有两个矢量如下所示:添加数值两个向量的使用Math.Net Numerics的用C#

vdA = { 8.0, 7.0, 6.0 } 
vdB = { 0.0, 1.0, 2.0, 3.0 } 

我想basicly该结果由所有值求和VDA的所有元素的矢量VDX的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

你基本上需要一个cross join in 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); 

这是不是特别快。