我需要根据以下内容创建快速 4D 查找表:1-它将接收 4 个输入变量(u、v、i、j),每个变量的范围从 0 到 15 2-查找表返回 8 位的预计算值如何我可以用 C 语言用非常快的代码实现这个 4D 查找表吗
问问题
1082 次
1 回答
3
只需在堆栈上创建一个 4 维数组。16^4 字节的大小应该适合大多数平台上的堆栈,否则使其成为静态或全局的。它为编译器提供了有关布局的完整知识,它是一种众所周知且常用的语言结构,它应该可以很好地优化:
uint8_t lookup[16][16][16][16]; // global table about 64KB
int main(int, char **)
{
...
当然,您可以制作一维数组uint8_t lookup[16*16*16*16]
并乘以您的值lookup[u*16*16*16 + v*16*16 + i*16 + j]
,但我非常怀疑您是否能够使其比 4-dim 数组具有更高的性能(编译器无论如何都会在内部进行这种乘法)
由于您要询问初始化,这里有一个如何初始化 4-dim 数组的示例。为简单起见,它只是[4][4][4][4]
,因此您必须将其增加到 16(16 个 16 行的块,16 个 16 个数字的系列。
uint8_t test[4][4][4][4]= {
{ // [0][x][y][z]
{ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 },
{ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 },
{ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 },
{ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } },
{ // [1][x][y][z]
{ 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 },
{ 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 },
{ 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 },
{ 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 } },
{ // [2][x][y][z]
{ 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 },
{ 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 },
{ 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 },
{ 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 } },
{ // [3][x][y][z]
{ 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 },
{ 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 },
{ 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 },
{ 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 } }
};
于 2013-06-13T09:04:43.297 回答