繁体   English   中英

Java中的快速4x4矩阵乘法与NIO浮点缓冲区

[英]Fast 4x4 matrix multiplication in Java with NIO float buffers

我知道有很多这样的问题,但我找不到具体的情况。 我有4x4矩阵实现为NIO浮点缓冲区(这些矩阵用于OpenGL)。 现在我想实现一个乘法方法,它将Matrix A与Matrix B相乘并将结果存储在Matrix 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相似)为此提供本机代码,但其他实现不提供。 所以我想为这些实现提供通用的乘法方法。

真正的答案当然是测试不同的实现并检查哪一个是最快的。

我的猜测,没有测试,将是因为矩阵是如此之小,手动扩展循环将导致最快的代码。 比如像

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 $。

如果支持该操作,请浏览FloatBuffer.array() 然后只需通过该数组执行必要的乘法运算,并返回结果矩阵。

看看GameDev.net - Matrix Math的精确计算。

如果你想进一步优化它,你可以尝试 Strassens算法 您甚至不需要填充矩阵,因为它们是正方形且大小为2的幂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM