我有一段代码从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,都会在几秒钟内完成所有这些操作。
谁能告诉我如何更快地做到这一点?有没有比我的代码更快的库?
谢谢! :)
答案 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)
您有几种选择:
使用锯齿状数组重写代码(如double[][] A
),速度应提高约2倍。
使用矩阵乘法代码编写非托管C / C ++ DLL。
使用具有本机BLAS实现的第三方数学库。我建议Math.NET Numerics,switched可以Intel MKL使用快速吸烟的http://jsfiddle.net/Barzi/Jzs6B/9/。
可能第三种选择是最好的。
答案 2 :(得分:0)
仅供记录:CloudCompare不是商业产品。它是一个免费的开源项目。并且没有庞大的开发团队和#39; (实际上只有极少数,在空闲时间这样做。)
这是我们最大的秘密:我们使用纯C ++代码;)。我们很少使用多线程但是对于非常冗长的进程(您必须考虑线程管理和处理时间开销)。
以下是一些最佳做法&#39;被称为时间加载的代码部分的规则: