我有一个代码需要做一些矩阵乘法,比如
ML2=ML+uMc+c1+c2
MC2=v*ML+(u*v+1)*Mc+c2
其中 ML 是 MXM 矩阵
ML=[1 1 1 1....1;2 2 2 2...2......;M M M.....M]
MC=[1 2 3 4 ...M;1 2 3 4...M......;1 2 3.....M]
u,v,c1 和 c2 是 8 位常数。
我想使用任何快速库在快速执行时间内找到 ML2、MC2 的值
我有一个代码需要做一些矩阵乘法,比如
ML2=ML+uMc+c1+c2
MC2=v*ML+(u*v+1)*Mc+c2
其中 ML 是 MXM 矩阵
ML=[1 1 1 1....1;2 2 2 2...2......;M M M.....M]
MC=[1 2 3 4 ...M;1 2 3 4...M......;1 2 3.....M]
u,v,c1 和 c2 是 8 位常数。
我想使用任何快速库在快速执行时间内找到 ML2、MC2 的值
您没有说明您想要的平台,但对于矩阵运算,没有什么比 Intel CPU 的 Intel Math Kernel Library 更快
http://software.intel.com/en-us/intel-mkl
这与我所看到的 CPU 上可能出现的峰值触发器一样接近。然而,MKL 昂贵且封闭源代码。如果您想要一个好的开源和免费替代方案,请查看 Eigen。这使用 C++,但我不知道您是否真的仅限于 C 代码。Eigen 也适用于其他硬件,例如 AMD(英特尔削弱了它在 AMD CPU 上的库)和 ARM。
http://eigen.tuxfamily.org/index.php?title=3.0
第三种选择自己写一个。经过几周的努力,用 AVX 和 OpenMP 击败 Eigen 应该不会太难(Eigen 只支持 SSE),但你很难击败 MKL。
对于 matrixA(AxB) 和 matrixB(BxC) 矩阵相乘得到 matrixC(AxC)
for(int i=0;i<l;i++)
{
for(int j=0;j<n;j++)
{
matrixC[i][j]=0;
for(int k=0;k<m;k++)
{
matrixC[i][j]=matrixC[i][j]+(matrixA[i][k] * matrixB[k][j]);
}
}
}
由于 ML 是一组相同的向量 1:M,而 MC 只是 ML 的转置,所以不需要一般的矩阵乘法。你可以走代数捷径。