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
,可能是在持久性
变量中?在过去几天中,我一直在试图弄清楚持久性
如何与代码的其他部分一起工作,并最终使用了不同的方法(全局)每次…这个函数对我来说都很神秘…你能说得更具体一点吗?我不太清楚它是如何工作的,更不用说如何在这里应用它了。我会查看容器。现在映射,但我从来没有使用iTunespersistent
而不是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)”,然后返回“尝试执行”