![](/img/trans.png)
[英]C# Matrix calculations and SVD using own generic type (with Math.NET Numerics)
[英]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.