C# 使用Math.Net Numerics和C实现逐点乘法列数组和矩阵#

C# 使用Math.Net Numerics和C实现逐点乘法列数组和矩阵#,c#,math,linear-algebra,math.net,numerics,C#,Math,Linear Algebra,Math.net,Numerics,我想使用Math.Net Numerics库对C#中给定矩阵中的列数组和每个列数组/向量执行逐点乘法 像这样的操作几乎没有文档,到目前为止,我有下面的代码,它不起作用。我正在尝试使用LINQ,因为我更喜欢它而不是循环。LINQ的问题是,当我尝试将矩阵的每一列作为向量枚举并执行PointwiseMultiply()方法时,我无法重新分配矩阵 Matrix fitKernel是我的矩阵,我想将每一列逐点乘以wF列数组,并使用LINQ更新我的Matrix fitKernel。fitKernel是9 x

我想使用Math.Net Numerics库对C#中给定矩阵中的列数组和每个列数组/向量执行逐点乘法

像这样的操作几乎没有文档,到目前为止,我有下面的代码,它不起作用。我正在尝试使用LINQ,因为我更喜欢它而不是循环。LINQ的问题是,当我尝试将矩阵的每一列作为向量枚举并执行PointwiseMultiply()方法时,我无法重新分配矩阵

Matrix fitKernel是我的矩阵,我想将每一列逐点乘以wF列数组,并使用LINQ更新我的Matrix fitKernel。fitKernel是9 x 5矩阵,wF是一个9 x 1双[]数组,我将其转换为下面LINQ中的向量

Matrix<double> fitKernel = Matrix<double>.Build.DenseOfColumnArrays(c1, c2, c3, c4, ones); 

double[] wF = Enumerable.Repeat(1.0, 9).ToArray();

fitKernel = fitKernel.EnumerateColumns()
            .Select(v => v.PointwiseMultiply(Vector<double>.Build.DenseOfArray(wF)));
Matrix fitKernel=Matrix.Build.DenseofColumnArray(c1、c2、c3、c4、ones);
double[]wF=Enumerable.Repeat(1.0,9.ToArray();
fitKernel=fitKernel.EnumerateColumns()
.选择(v=>v.PointwiseMultiply(Vector.Build.DenseOfArray(wF));

上面使用EnumerateColumns()的代码返回向量的IEnumerable,但当我尝试将值分配给fitKernel时,它会抱怨将枚举类型分配给矩阵。

我想我已经解决了,但您必须使用for循环;使用LINQ似乎并不容易:

for (int i = 0; i < fitKernel.ColumnCount; i++)
{
        var v = fitKernel.Column(i);
        v = v.PointwiseMultiply(Vector<double>.Build.DenseOfArray(wF));
        fitKernel.SetColumn(i, v);
}
for(int i=0;i
我想我找到了答案,但你必须使用for循环;使用LINQ似乎并不容易:

for (int i = 0; i < fitKernel.ColumnCount; i++)
{
        var v = fitKernel.Column(i);
        v = v.PointwiseMultiply(Vector<double>.Build.DenseOfArray(wF));
        fitKernel.SetColumn(i, v);
}
for(int i=0;i
如果要编写for循环,不妨编写两个

    // a = double[9];
    // c = Matrix<double>

    for (int ic = 0; ic < c.ColumnCount; ic++)
    {
        for (int ir = 0; ir < c.RowCount; ir++) c[ir, ic] = a[ir] * c[ir, ic];
    }

第一行返回新列,但仍需将它们插入矩阵。请注意,我们相信枚举器会按自然顺序返回列。可以使用EnumerateColumnsIndex将其减少为两行。它需要更多的细节,但消除了关于列顺序的可能模糊性。

如果要编写for循环,最好编写两个

    // a = double[9];
    // c = Matrix<double>

    for (int ic = 0; ic < c.ColumnCount; ic++)
    {
        for (int ir = 0; ir < c.RowCount; ir++) c[ir, ic] = a[ir] * c[ir, ic];
    }

第一行返回新列,但仍需将它们插入矩阵。请注意,我们相信枚举器会按自然顺序返回列。可以使用EnumerateColumnsIndex将其减少为两行。它需要更多的细节,但消除了关于列顺序的可能的模糊性。

顺便说一句,将PointwiseMultiply和SetColumn组合在一个语句中是行不通的,如下所示:

        var r = c.EnumerateColumnsIndexed().Select((v) => c.SetColumn(v.Item1, v.Item2.PointwiseMultiply(va)));

显然是因为SetColumn是空的。如果有人有解决方法,请发布。

顺便说一句,将PointwiseMultiply和SetColumn组合在一个语句中是不起作用的,如下所示:

        var r = c.EnumerateColumnsIndexed().Select((v) => c.SetColumn(v.Item1, v.Item2.PointwiseMultiply(va)));

显然是因为SetColumn是空的。如果有人有解决方法,请发布。

Linq的Select有一种形式,它接受一个带有索引和项的函数,您可以使用它,但这取决于设置列是否会使迭代器无效。Linq的Select有一种形式,它接受一个带有索引和项的函数,您可以使用它,但这取决于设置列是否使迭代器无效。谢谢您的输入。您最后的代码片段和我发布的答案都可以作为解决方案。我认为我们可以得出结论,似乎不可能使用Math.Net Numerics执行逐点乘法并通过LINQ在一行中设置矩阵中的列;您必须使用foreach或for循环。感谢您的输入。您最后的代码片段和我发布的答案都可以作为解决方案。我认为我们可以得出结论,似乎不可能使用Math.Net Numerics执行逐点乘法并通过LINQ在一行中设置矩阵中的列;必须使用foreach或for循环。