在Matlab预先计算的函数的结果的高速缓存(Caching result of pre-compu

2019-06-25 17:34发布

我有两个数组, xyx是函数的输入和y是函数值。 例如, x = [ 1 2 3 4 5 6 7 8 9 10] y = [ 3 6 2 4 1 6 7 0 1 8 ] 两者是相同的长度。

假设我有一个另一个数组z含有[ 2 3 8 9 10 3]未长度相同xy ),是否有产生输出的任何功能[6 2 0 1 8 2]返回值在对应索引)不通过数组的每个元素使用for循环?

非常感谢

EDIT1 *我该怎么办,如果阵列中的数字不是整数?

Answer 1:

y(z)

这就是你需要......



Answer 2:

我认为,你只是想:

y(z);  

这将返回y向量的第i个元素。 您可能希望

y(x(z));

这将返回在你的例子同样的结果,因为x是刚刚经历10值1。

有了这两种的z只能包含正整数,而在第二种情况下x还只能包含正整数。



Answer 3:

如果您使用的是MATLAB版本更新比2008B,你可以使用containers.Map类做你想要什么,甚至非整数,非连续的或非数字的值:

 x  = [ 1 2 3 4 5 6 7 8 9 10];
 y  = [ 3 6 2 4 1 6 7 0 1 8 ];
 z  = [ 2 3 8 9 10 3];
 F  = containers.Map(x,y);
 % for a single element:
 Fz1 = F(z(1))
 % for multiple elements at the same time, you need to use arrayfun
 Fz = arrayfun(@(x)(F(x)),z) 

地图类实际上是创建一个所谓的HashMap,这样你就可以映射到其他值几乎所有的值(例如字符串,细胞阵列,...)。

当该项目不存在,它会返回一个错误。

如果您无法使用MATLAB 2008B或更新的版本,有三种可能的非整数域值。

使用插值方法,如interp1 。 这可能给(在那些没有事先提供的值)假值。 您可以通过使用检查这种情况下ismember(z, x)

其次,你可以从非整数到整数(例如,如果所有的值是0.5的倍数,乘以2)发明自己的方案,并使用该解决方案奥利显示。

另一种解决方案是使用struct s到模仿地图的行为。 然后你只需要你的域值有效的字段名称(即字符串是在MATLAB有效的变量名,这可以通过使用可以转换genvarname功能)。

最后这两个方案都有点脏,容易出错,如果你不采取四舍五入考虑。 所以,我只看到他们作为最后的手段。



文章来源: Caching result of pre-computed function in Matlab