我知道有很多这样的问题,但我找不到具体的情况。我有4x4矩阵实现为NIO浮点缓冲区(这些矩阵用于OpenGL)。现在我想实现一个乘法方法,它将矩阵A与矩阵B相乘,并将结果存储在矩阵C中。所以代码可能如下所示:
class Matrix4f
{
private FloatBuffer buffer = FloatBuffer.allocate(16);
public Matrix4f multiply(Matrix4f matrix2, Matrix4f result)
{
{{{result = this * matrix2}}} <-- I need this code
return result;
}
}
执行此乘法的最快代码是什么?一些OpenGL实现(与Android中的OpenGL ES相似)为此提供本机代码,但其他实现不提供。所以我想为这些实现提供通用的乘法方法。
答案 0 :(得分:6)
真正的答案当然是测试不同的实现并检查哪一个最快。
我的猜测是,没有测试,因为矩阵太小,手动扩展循环会产生最快的代码。例如。
之类的东西result[0][0] = this[0][0] * matrix2[0][0] + this[0][1] * matrix2[1][0]
+ this[0][2] * matrix2[2][0] + this[0][3] * matrix2[3][0];
result[0][1] = // ... and so forth
或者可能只是展开最里面的循环,并保留两个最外面的循环以节省一些打字以及I $。
答案 1 :(得分:3)
如果支持该操作,请浏览FloatBuffer.array()。然后只需通过该数组执行必要的乘法运算,并返回结果矩阵。
查看GameDev.net - Matrix Math的确切计算。
如果您想进一步优化它,可以尝试Strassens Algorithm。您甚至不需要填充矩阵,因为它们是正方形且大小为2的幂。