Matlab 如何编写创建和存储变量的函数?

Matlab 如何编写创建和存储变量的函数?,matlab,function,memoization,Matlab,Function,Memoization,我希望有一个函数函数y(x),当我调用y(5.12)时,它将创建一个变量y(5.12)(或者以某种方式记住y(5.12)是什么),在函数运行完毕后可以使用。做这样的事情最简单的方法是什么 我会创建一个数组,只将每个值存储在相应的单元格中,但我也会有非整数值和负值,所以数组不起作用:(我将使用一个简单数组和一个持久变量来表示我的解决方案 假设您有一个计算数字平方的函数,并且您希望进行一些记忆 在我的代码中,my_hist是一个二维向量。第一个维度对应于输入,第二个维度对应于输入(即输出)的平方 我

我希望有一个函数
函数y(x)
,当我调用
y(5.12)
时,它将创建一个变量y(5.12)(或者以某种方式记住y(5.12)是什么),在函数运行完毕后可以使用。做这样的事情最简单的方法是什么


我会创建一个数组,只将每个值存储在相应的单元格中,但我也会有非整数值和负值,所以数组不起作用:(

我将使用一个简单数组和一个
持久变量来表示我的解决方案

假设您有一个计算数字平方的函数,并且您希望进行一些记忆

在我的代码中,
my_hist
是一个二维向量。第一个维度对应于输入,第二个维度对应于输入(即输出)的平方

我引入了2秒的人工延迟来模拟计算耗时的情况

现在,如果我第一次运行代码要求
memo_sqr(x)
,计算需要大约2秒(包括人工滞后)。但是,如果我再次要求,持久查找表会立即给出答案

>> tic; memo_sqr(2); toc;
Elapsed time is 2.056881 seconds.
>> tic; memo_sqr(2); toc;
Found Entry in Table

y =

     4

Elapsed time is 0.000545 seconds.


这显然是一个非常简单的示例,但它强调了如何使用
持久变量。我的代码片段的各个步骤可以根据您的需要进行优化。

Andrew Janke非常适合。使用a.
容器。Map
就是所谓的an。它也被称为符号表、Map或dictionary。主干behind a associative array是指通过一个键访问数组,并获得一个与该键相关的值

最好的例子是一本英语词典,其中关键字是您要查找的单词,值是该特定单词的定义。例如(没有任何修饰),假设我们的词典是
f
,我使用的关键字是
rayryeng
,一个可能的值可以是:

f('rayryeng') --> he is awesome
现在在MATLAB中,可能的键类型列表是:
'char'、'double'、'single'、'int32'、'uint32'、'int64'或'uint64'
。可能的值列表是
'char'、'logical'、'double'、'single'、'int8'、'uint8'、'int16'、'uint16'、'int32'、'uint32'、'uint32'、'int32'、'int32'、'int32'、int64'或'uint64'
。对于您e键为
双精度
,值为
字符

因此,初始化
容器。映射
以识别此键/值组合:

f = containers.Map('KeyType','double','ValueType','char')
我们得到这个:

f = 

  Map with properties:

        Count: 0
      KeyType: double
    ValueType: char
此字典中当前没有键/值对,预期的键是一个
double
,输出值是一个
char
。我们可以随意添加内容:

>> f(5.12) = 'hello';
>> f(-1.56) = 'Solarmew';
>> f(pi) = 'YES!';
我添加了3个不同字符串的键,分别为5.12、-1.56和
pi
。现在,如果要检索给定键的值,只需给出正确的键:

>> x = f(-1.56)

x =

Solarmew
如果您尝试给出一个不存在的密钥,MATLAB将给出一个错误:

>> y = f(0)

Error using containers.Map/subsref
The specified key is not present in this container.
如果要检查字典中是否存在键,请使用
isKey
方法:

>> isKey(f, 0)

ans = 

  0
>> k = keys(f)

k = 

    [-1.5600]    [3.1416]    [5.1200]
>> v = values(f);

v = 

    'Solarmew'    'YES!'    'hello'
>> remove(f, -1.56);
>> k = keys(f)

k = 

    [3.1416]    [5.1200]

>> v = values(f)

v = 

    'YES!'    'hello'
为您提供了更多方法。您可以使用
keys
方法检索字典中当前的所有键:

>> isKey(f, 0)

ans = 

  0
>> k = keys(f)

k = 

    [-1.5600]    [3.1416]    [5.1200]
>> v = values(f);

v = 

    'Solarmew'    'YES!'    'hello'
>> remove(f, -1.56);
>> k = keys(f)

k = 

    [3.1416]    [5.1200]

>> v = values(f)

v = 

    'YES!'    'hello'
k
是一个单元格数组,其中每个元素在此字典中都是一个键。类似地,如果需要值,请使用
values
方法:

>> isKey(f, 0)

ans = 

  0
>> k = keys(f)

k = 

    [-1.5600]    [3.1416]    [5.1200]
>> v = values(f);

v = 

    'Solarmew'    'YES!'    'hello'
>> remove(f, -1.56);
>> k = keys(f)

k = 

    [3.1416]    [5.1200]

>> v = values(f)

v = 

    'YES!'    'hello'
需要注意的是,
都不能保证任何顺序。这意味着添加键和值的顺序并不一定意味着在调用
时会得到相同的顺序。最后,如果要从在字典中,使用
删除
方法:

>> isKey(f, 0)

ans = 

  0
>> k = keys(f)

k = 

    [-1.5600]    [3.1416]    [5.1200]
>> v = values(f);

v = 

    'Solarmew'    'YES!'    'hello'
>> remove(f, -1.56);
>> k = keys(f)

k = 

    [3.1416]    [5.1200]

>> v = values(f)

v = 

    'YES!'    'hello'
如您所见,与
Solarmew
关联的
-1.56
键现在已从字典中删除



希望这能有所帮助!

您是否尝试过
容器.Map
,可能是在
持久性
变量中?在过去几天中,我一直在试图弄清楚
持久性
如何与代码的其他部分一起工作,并最终使用了不同的方法(全局)每次…这个函数对我来说都很神秘…你能说得更具体一点吗?我不太清楚它是如何工作的,更不用说如何在这里应用它了。我会查看容器。现在映射,但我从来没有使用iTunes
persistent
而不是
global
;从长远来看,你的代码会工作得更好。本文涵盖了它
persistent
表示变量在多次调用函数时保持其值。清除函数(在更改和保存函数时隐式发生)将重置其持久变量的值;可能这就是混淆的原因。很酷的东西!:]仍然似乎与函数(实际赋值将来自)不兼容
w=containers.Map('KeyType','double','ValueType','char');
函数wOut=w(z)wOut=w0*sqrt(1+(z/zr)^2) ;w(z)=wOut;end
这是因为您没有正确定义函数。像您那样创建
容器.Map
,然后将其用作函数的输入。您试图使函数名和
容器.Map
同名。请执行以下操作:
函数w=f(w,z,w0,zr)w(z)=w0*sqrt(1+(z/zr)^2);结束
,那么你所要做的就是在工作区中
w=f(w,z,w0,zr);
w
现在应该用你放进去的任何东西更新。仍然不工作:(…我在工作区中键入了“w=containers.Map('KeyType','double','ValueType','char');”,然后将我的函数“test编辑为“function w=test(z))%w(z)=sqrt(z);结束并在工作区中键入“测试(0.1)”,然后返回“尝试执行”