【问题标题】:Caching result of pre-computed function in MatlabMatlab中预计算函数的缓存结果
【发布时间】:2012-06-26 01:28:00
【问题描述】:

我有两个数组,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 的长度不同), 是否有任何函数可以在不使用 for 循环遍历数组的每个元素的情况下产生输出 [6 2 0 1 8 2](相应索引处的返回值)?

非常感谢

edit1* 如果数组中的数字不是整数怎么办?

【问题讨论】:

标签: matlab memoization


【解决方案1】:
y(z)

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

【讨论】:

  • z不是整数怎么办?
【解决方案2】:

我认为你只是想要:

y(z);  

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

y(x(z));

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

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

【讨论】:

  • 我认为y(x(z)) 不会添加任何有用的功能。你实际上需要x的反向映射。
  • z不是整数怎么办?
【解决方案3】:

如果您使用的是 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 展示的解决方案。

另一种解决方案是使用structs 来模拟地图的行为。然后,您只需将域值转换为有效的字段名称(即 MATLAB 中有效变量名称的字符串,这可以通过使用 genvarname 函数来实现)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2012-03-06
    • 2016-01-19
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多