MathNet.Numerics矩阵乘法性能偏低的原因及优化方案咨询
MathNet.Numerics矩阵乘法性能问题咨询
我在C#应用中使用MathNet.Numerics库执行矩阵运算时,发现该库的矩阵乘法性能远低于常规标量乘法及手动实现的运算。
简化代码示例(MathNet.Numerics实现)
using MathNet.Numerics.LinearAlgebra; public List<Point3D> ToSomething( MathN.Matrix<float> matrixA, MathN.Matrix<float> matrixB, List<Point3D> points) { MathN.Matrix<float> matrixC = MathN.Matrix<float>.Build.Dense(4, points.Count, 1); for (int i = 0; i < points.Count; i++) { // 为matrixC赋值的代码 } // 使用MathNet.Numerics执行矩阵乘法 var resMat = (matrixA * matrixB) * matrixC; // 耗时显著更长 var ptsInPcs = new List<Point3D>(resMat.ColumnCount); // 其他处理代码 return ptsInPcs; }
原本预期MathNet.Numerics能高效执行矩阵乘法,但相比基础自定义实现,它存在显著性能开销。以下是性能更优的手动嵌套循环实现:
手动实现的矩阵乘法
// 基于一维数组的自定义矩阵乘法方法 public List<Point3D> ToSomethingFlatArray( float[] matrixA, float[] matrixB, List<Point3D> points) { int numPoints = points.Count; float[] tempMatrixA = new float[4 * numPoints]; float[] tempMatrixB = new float[4 * numPoints]; float[] tempMatrixC = new float[4 * 4]; for (int i = 0; i < numPoints; i++) { // 相关赋值代码 } MatrixMultiply(matrixA, 4, 4, matrixB, 4, 4, tempMatrixC); MatrixMultiply(tempMatrixC, 4, 4, tempMatrixA, 4, numPoints, tempMatrixB); var ptsInPcs = new List<Point3D>(numPoints); // 其他处理代码 return ptsInPcs; } static void MatrixMultiply(float[] A, int aRows, int aCols, float[] B, int bRows, int bCols, float[] result) { if (aCols != bRows) throw new ArgumentException("矩阵维度不兼容,无法执行乘法。"); for (int i = 0; i < aRows; i++) { int aRowOffset = i * aCols; int resultRowOffset = i * bCols; for (int j = 0; j < bCols; j++) { float sum = 0; for (int k = 0; k < aCols; k++) { sum += A[aRowOffset + k] * B[k * bCols + j]; } result[resultRowOffset + j] = sum; } } }
基准测试结果

现咨询以下问题:
- 这是MathNet.Numerics的已知问题吗?
- MathNet中有哪些优化技术或设置可提升矩阵乘法性能?
- 在C#中,其他库或自定义实现是否能提供更优的矩阵运算性能?
内容的提问来源于stack exchange,提问作者mariov32
相关产品推荐
相关产品推荐

