2

次のような 2 つのベクトルがあります。

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

基本的に、vdA のすべての要素を vdB のすべての値で合計するベクトル vdX が必要です。

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());

c# で Math.Net Numerics を使用してこれをより速く達成するための他のオプションはありますか?

4

1 に答える 1

2

基本的に 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);

これは特に高速ではありません。

于 2013-10-23T07:34:03.850 に答える