我需要更快地完成我的操作

时间:2015-07-23 07:08:40

标签: c# matrix time stl transformation

我有一段代码从stl中读取点,然后我必须进行转换,使用这个stl的转换矩阵,并将结果写在其他stl上。我做了所有这些,但它太慢了,大约5分钟或更长时间。

我把矩阵乘法的代码,它收到了两个矩阵,然后进行乘法运算:

public double[,] MultiplyMatrix(double[,] A, double[,] B)
    {
        int rA = A.GetLength(0);
        int cA = A.GetLength(1);
        int rB = B.GetLength(0);
        int cB = B.GetLength(1);
        double temp = 0;
        double[,] kHasil = new double[rA, cB];
        if (cA != rB)
        {
            MessageBox.Show("matrix can't be multiplied !!");
        }
        else
        {
            for (int i = 0; i < rA; i++)
            {
                for (int j = 0; j < cB; j++)
                {
                    temp = 0;
                    for (int k = 0; k < cA; k++)
                    {
                        temp += A[i, k] * B[k, j];
                    }
                    kHasil[i, j] = temp;
                }
            }
            return kHasil;
        }
        return kHasil;
    }

我的问题是所有代码都太慢了,它必须从stl中读取,将所有点相乘并在其他stl中写入结果,它花费5-10分钟来完成。我看到所有商业计划,比如cloudcompare,都会在几秒钟内完成所有这些操作。

谁能告诉我如何更快地做到这一点?有没有比我的代码更快的库?

谢谢! :)

3 个答案:

答案 0 :(得分:1)

我喜欢上网:

 double[] iRowA = A[i];
double[] iRowC = C[i];
for (int k = 0; k < N; k++) {
    double[] kRowB = B[k];
    double ikA = iRowA[k];
    for (int j = 0; j < N; j++) {
        iRowC[j] += ikA * kRowB[j];
    }
}

然后使用Plinq

 var source = Enumerable.Range(0, N);
var pquery = from num in source.AsParallel()
             select num;
pquery.ForAll((e) => Popt(A, B, C, e));

其中Popt是我们的方法名称,采用3个锯齿状数组(C = A * B)和要计算的行(e)。这有多快:

 1.Name   Milliseconds2.Popt       187

来源是:Daniweb

  

比原始代码快12倍!借助PLINQ的神奇之处,我们在这个例子中创建了500个线程,并且不必管理其中的一个,所有内容都是为您处理的。

答案 1 :(得分:0)

您有几种选择:

  1. 使用锯齿状数组重写代码(如double[][] A),速度应提高约2倍。

  2. 使用矩阵乘法代码编写非托管C / C ++ DLL。

  3. 使用具有本机BLAS实现的第三方数学库。我建议Math.NET Numericsswitched可以Intel MKL使用快速吸烟的http://jsfiddle.net/Barzi/Jzs6B/9/

  4. 可能第三种选择是最好的。

答案 2 :(得分:0)

仅供记录:CloudCompare不是商业产品。它是一个免费的开源项目。并且没有庞大的开发团队和#39; (实际上只有极少数,在空闲时间这样做。)

这是我们最大的秘密:我们使用纯C ++代码;)。我们很少使用多线程但是对于非常冗长的进程(您必须考虑线程管理和处理时间开销)。

以下是一些最佳做法&#39;被称为时间加载的代码部分的规则:

  • 避免任何动态内存分配
  • 尽可能减少(远)函数调用
  • 始终先处理最可能的案例,然后再处理“if-then-else”#39;支化
  • 避免非常小的循环(如果N = 2或3,则内联