如何在MATLAB中使用查找表

时间:2010-10-15 08:26:54

标签: optimization matlab lookup-tables

我需要在一组2D阵列上执行两个参数(一组:t,另一组来自阵列)的指数运算(如果需要,可以使用3D矩阵)。     f(t,x)= exp(t-x) 然后我需要在第三维中添加每个值的结果。因为使用bsxfun执行整个操作需要花费太多时间,所以我考虑使用查找表。

我可以将表格创建为矩阵LUT(由于两个参数而为2维),然后我可以使用LUT(par1,par2)检索值。但是使用循环访问第三维也很昂贵。

我的问题是:有没有办法实现这样的机制(查找表)以获得预定义的值,然后只使用它们从矩阵元素(索引类型)访问而不需要循环。或者,如何创建一个MATLAB自动处理的查找表来加速指数运算?

编辑: 我实际上使用类似的方法来创建LUT。现在,我的问题实际上是如何以有效的方式访问它。

让我说我有一个二维数组M。使用这些值,我想将函数f(t,M(i,j))应用于固定值t。我可以使用循环遍历M的所有值(i,j)但是我想要更快的方法,因为我有一组M,然后我需要将此过程应用于所有其他值

我的功能比我给出的例子有点复杂:

pr = mean(exp(-bsxfun(@rdivide,bsxfun(@minus,color_vals,double(I)).^2,m)./2),3);

这是我的实际功能,你可以看到比我提出的例子更复杂。但这个想法是一样的。它在两组数据的指数的M的集合的第三维中取平均值。

希望有所帮助。

2 个答案:

答案 0 :(得分:5)

我同意这个问题不是很清楚,而且显示一些代码会有所帮助。无论如何我都会尝试。

为了使LUT有意义,t-x获得的值集必须受到限制,例如整数。

假设指数可以是-1000到1000之间的任何整数,你可以像这样创建一个LUT:

LUT = exp(-1000:1000);

然后创建索引(假设t是一维数组,x是二维数组)

indexArray = bsxfun(@minus,reshape(t,[1,1,3]), x) + 1001; %# -1000 turns into 1

最后,您创建结果

output = LUT(indexArray);
%# sum along third dimension (i.e. sum over all `t`)
output = sum(output,3);

答案 1 :(得分:0)

我不确定我理解你的问题,但我认为这就是答案。

x = 0:3
y = 0:2
z = 0:6

[X,Y,Z] = meshgrid(x,y,z)

LUT = (X+Y).^Z