Matlab中预先计算函数的缓存结果

时间:2012-06-24 14:42:10

标签: matlab memoization

我有两个数组,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 *如果数组中的数字不是整数,我该怎么办?

3 个答案:

答案 0 :(得分:0)

y(z)

这就是你所需要的......

答案 1 :(得分:0)

我认为你只是想要:

y(z);  

这将返回y向量的第z个元素。你可能想要

y(x(z));

这将在您的示例中返回相同的结果,因为x只是值1到10。

这两个z只能包含正整数,而在第二种情况下x也必须只包含正整数。

答案 2 :(得分:0)

如果您使用的是比2008b更新的MATLAB版本,您可以使用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) 

Map类实际上创建了一个所谓的hashmap,因此您可以将几乎任何值映射到其他值(例如字符串,单元格,数组......)。

当项目不存在时,将返回错误。

如果您不能使用MATLAB 2008b或更新版本,非整数域值有三种可能性。

使用interp1等插值方法。这可能会给出错误的值(在预先未提供的值)。您可以使用ismember(z, x)检查该案例。

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

另一个解决方案是使用struct来模仿地图的行为。然后,您只需要从域值到有效字段名称的转换(即在MATLAB中作为有效变量名称的字符串,可以使用genvarname函数)。

如果不考虑四舍五入,最后两个解决方案有点脏,容易出错。所以我认为它们只是最后的手段。