如何在MATLAB中使用查找表

3
我需要在一个2D数组的一组参数(一个集合:t,另一个来自数组)上执行指数运算(如果您愿意,可以是3D矩阵)。 f(t,x)= exp(t-x),然后我需要将第三维中每个值的结果相加。由于使用bsxfun执行整个操作需要太长时间,因此我考虑使用查找表。
我可以将表格创建为矩阵LUT(由于两个参数而具有两个维度),然后我可以使用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 集合的第三个维度进行指数差的平均值计算。希望这能有所帮助。

为什么不把你已经有的代码发布出来呢? - Amro
3
你知道 exp(t-x)=exp(t)/exp(x),所以你只需要一个 exp() 的查找表。 - John Alexiou
2个回答

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);

2
谢谢,我使用了您的解决方案,并借助sub2ind函数进行了帮助。不幸的是,使用LUT比使用bsxfun执行操作要慢。 - adn

0

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

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

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

LUT = (X+Y).^Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接