adn*_*adn 3 optimization matlab lookup-tables
我需要在一组2D阵列(如果需要的话,3D矩阵)上执行两个参数(一组:t,另一组来自阵列)的指数运算.f(t,x)= exp(tx)然后我需要在第三维中添加每个值的结果.因为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);
Run Code Online (Sandbox Code Playgroud)
这是我的实际功能,你可以看到比我提出的例子更复杂.但这个想法是一样的.它在两组数据的指数的M的集合的第三维中进行平均.
希望有所帮助.
我同意这个问题不是很清楚,显示一些代码会有所帮助.无论如何我会尝试.
为了使LUT有意义,t-x
必须限制所获得的值集合,例如限制为整数.
假设指数可以是-1000到1000之间的任何整数,你可以像这样创建一个LUT:
LUT = exp(-1000:1000);
Run Code Online (Sandbox Code Playgroud)
然后创建索引(假设t
是1D数组,x是2D数组)
indexArray = bsxfun(@minus,reshape(t,[1,1,3]), x) + 1001; %# -1000 turns into 1
Run Code Online (Sandbox Code Playgroud)
最后,您创建结果
output = LUT(indexArray);
%# sum along third dimension (i.e. sum over all `t`)
output = sum(output,3);
Run Code Online (Sandbox Code Playgroud)