簡體   English   中英

使用帶有C#的Math.Net數值進行逐點乘法列數組和矩陣

[英]Point-wise Multiply Column Array and Matrix using Math.Net Numerics with C#

我想使用Math.Net Numerics庫對C#中給定矩陣中的每個列數組/向量執行列數組的逐點乘法。

關於此類操作的文檔很少,到目前為止,我下面的代碼無法正常工作。 我正在嘗試使用LINQ,因為我更喜歡for循環。 LINQ遇到的問題是,當我嘗試將矩陣的每一列枚舉為向量並執行PointwiseMultiply()方法時,我無法重新分配矩陣。

矩陣fitKernel是我的矩陣,我想將每列乘以wF列數組,並使用LINQ更新我的矩陣fitKernel fitKernel是9 x 5矩陣,wF是9 x 1 double []數組,我在下面的LINQ中將其轉換為Vector。

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

上面的代碼使用EnumerateColumns()返回向量的IEnumerable,但是當我嘗試將值分配給fitKernel時,它抱怨為矩陣分配Enumerable類型。

如果要編寫一個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];
    }

它可能是最快,最簡短的解決方案,但據我了解,它並不能告訴讀者您的想法。 OTOH,如果要使用枚舉器,則讓它控制循環是有意義的。

        var va = Vector<double>.Build.DenseOfArray(a);

        var ColEnum = c.EnumerateColumnsIndexed() ;

        foreach (System.Tuple<int,Vector<double>> col in ColEnum)
        {
            Vector<double> v = (Vector<double>)col.Item2.PointwiseMultiply((Vector<double>)va);
            c.SetColumn(col.Item1, v);
        } 

我最接近您的第一個公式的是:

        var r = c.EnumerateColumns().Select(v => v.PointwiseMultiply(va));
        int i = 0;
        foreach (Vector ri in r) c.SetColumn(i++, ri);

第一行返回您的新列,但是您仍然必須將它們插入到Matrix中。 請注意,我們信任枚舉數以其自然順序帶回列。 使用EnumerateColumnsIndexed可以將其減少到兩行。 它需要更多細節,但是消除了有關列順序的可能歧義。

順便說一句,將PointwiseMultiply和SetColumn組合在一個這樣的語句中是行不通的:

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

顯然是因為SetColumn為空。 如果有人有解決方法,請發布它。

我想我已經解決了,但是您必須使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM