You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

基准测试结果

基准测试结果

现咨询以下问题:

  1. 这是MathNet.Numerics的已知问题吗?
  2. MathNet中有哪些优化技术或设置可提升矩阵乘法性能?
  3. 在C#中,其他库或自定义实现是否能提供更优的矩阵运算性能?

内容的提问来源于stack exchange,提问作者mariov32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:43:22