如何编写一个函数来创建和存储变量?
How can I write a function that will create and store variables?
我想要一个函数 function y(x)
,当我调用 y(5.12)
时,它会创建一个可用的变量 y(5.12)(或者以某种方式记住 y(5.12) 是什么)功能完成后使用运行。做这样的事情最简单的方法是什么?
我会制作一个数组并将每个值存储在其相应的单元格中,但我也会有非整数和负值,所以数组不起作用:(
我将使用一个简单的数组和一个 persistent
变量来展示我的解决方案。
假设您有一个计算数字平方的函数,并且您想要进行一些记忆。
在我的代码中,my_hist
是一个二维向量。第一维对应输入,第二维对应输入的平方(即输出)。
function y = memo_sqr(x)
persistent my_hist;
if(isempty(my_hist))
my_hist = [0 0];
end
%Find if it is already present
idx = find(my_hist(:,1)==x);
if idx
disp('Found Entry in Table')
y = my_hist(idx,2)
return
end
y = x^2;
my_hist = [my_hist; x y];
pause(2); %Artifical Lag
end
我引入了一些人为的2秒延迟来模拟计算耗时的情况。
现在,如果我 运行 代码第一次请求 memo_sqr(x)
,计算需要奇数 2 秒(包括人为滞后)。但是,如果我再次询问它,持续查找 table 会立即给我答案。
>> 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.
这显然是一个非常简单的示例,但它强调了如何使用 persistent
变量。可以优化我的代码片段的各个步骤以满足您的需求。
Andrew Janke 是正确的。使用 containers.Map
. containers.Map
is what is known as an associative array。它也称为符号 table、地图或字典。关联数组背后的 backbone 是您通过 key 访问数组,并获得与该键一起的关联值。
最好的例子是英语词典,其中键是您要查找的词,值是该特定词的定义。例如(没有任何修饰),假设我们的字典是f
,我使用了键rayryeng
,一个可能的值可能是:
f('rayryeng') --> he is awesome
现在在 MATLAB 中,可能的键类型列表是:'char', 'double', 'single', 'int32', 'uint32', 'int64', or 'uint64'
。可能值的列表是 'char', 'logical', 'double', 'single', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', or 'uint64'
。鉴于您的应用程序,听起来您希望键为 double
且值为 char
.
因此,初始化您的 containers.Map
以识别此 key/value 组合:
f = containers.Map('KeyType','double','ValueType','char')
我们得到这个:
f =
Map with properties:
Count: 0
KeyType: double
ValueType: char
当前字典中没有 key/value 对,期望的键是 double
,输出值是 char
。我们可以开始随意添加东西了:
>> f(5.12) = 'hello';
>> f(-1.56) = 'Solarmew';
>> f(pi) = 'YES!';
我添加了 5.12、-1.56 和 pi
3 个键,它们具有不同的字符串。现在,如果您想检索给定键的值,只需提供正确的键即可:
>> 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
再给你一些方法。您可以使用 keys
方法检索当前字典中的所有键:
>> k = keys(f)
k =
[-1.5600] [3.1416] [5.1200]
k
是一个元胞数组,其中每个元素都是该字典中的一个键。同样,如果您想要这些值,请使用 values
方法:
>> v = values(f);
v =
'Solarmew' 'YES!' 'hello'
请注意,keys
和 values
均不保证任何顺序。这意味着您添加键和值的顺序并不一定意味着您在调用 keys
或 values
时将获得相同的顺序。最后,如果你想从字典中删除一对key/value,使用remove
方法:
>> remove(f, -1.56);
>> k = keys(f)
k =
[3.1416] [5.1200]
>> v = values(f)
v =
'YES!' 'hello'
如您所见,与 Solarmew
关联的 -1.56
的键现已从字典中删除。
希望对您有所帮助!
我想要一个函数 function y(x)
,当我调用 y(5.12)
时,它会创建一个可用的变量 y(5.12)(或者以某种方式记住 y(5.12) 是什么)功能完成后使用运行。做这样的事情最简单的方法是什么?
我会制作一个数组并将每个值存储在其相应的单元格中,但我也会有非整数和负值,所以数组不起作用:(
我将使用一个简单的数组和一个 persistent
变量来展示我的解决方案。
假设您有一个计算数字平方的函数,并且您想要进行一些记忆。
在我的代码中,my_hist
是一个二维向量。第一维对应输入,第二维对应输入的平方(即输出)。
function y = memo_sqr(x)
persistent my_hist;
if(isempty(my_hist))
my_hist = [0 0];
end
%Find if it is already present
idx = find(my_hist(:,1)==x);
if idx
disp('Found Entry in Table')
y = my_hist(idx,2)
return
end
y = x^2;
my_hist = [my_hist; x y];
pause(2); %Artifical Lag
end
我引入了一些人为的2秒延迟来模拟计算耗时的情况。
现在,如果我 运行 代码第一次请求 memo_sqr(x)
,计算需要奇数 2 秒(包括人为滞后)。但是,如果我再次询问它,持续查找 table 会立即给我答案。
>> 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.
这显然是一个非常简单的示例,但它强调了如何使用 persistent
变量。可以优化我的代码片段的各个步骤以满足您的需求。
Andrew Janke 是正确的。使用 containers.Map
. containers.Map
is what is known as an associative array。它也称为符号 table、地图或字典。关联数组背后的 backbone 是您通过 key 访问数组,并获得与该键一起的关联值。
最好的例子是英语词典,其中键是您要查找的词,值是该特定词的定义。例如(没有任何修饰),假设我们的字典是f
,我使用了键rayryeng
,一个可能的值可能是:
f('rayryeng') --> he is awesome
现在在 MATLAB 中,可能的键类型列表是:'char', 'double', 'single', 'int32', 'uint32', 'int64', or 'uint64'
。可能值的列表是 'char', 'logical', 'double', 'single', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', or 'uint64'
。鉴于您的应用程序,听起来您希望键为 double
且值为 char
.
因此,初始化您的 containers.Map
以识别此 key/value 组合:
f = containers.Map('KeyType','double','ValueType','char')
我们得到这个:
f =
Map with properties:
Count: 0
KeyType: double
ValueType: char
当前字典中没有 key/value 对,期望的键是 double
,输出值是 char
。我们可以开始随意添加东西了:
>> f(5.12) = 'hello';
>> f(-1.56) = 'Solarmew';
>> f(pi) = 'YES!';
我添加了 5.12、-1.56 和 pi
3 个键,它们具有不同的字符串。现在,如果您想检索给定键的值,只需提供正确的键即可:
>> 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
再给你一些方法。您可以使用 keys
方法检索当前字典中的所有键:
>> k = keys(f)
k =
[-1.5600] [3.1416] [5.1200]
k
是一个元胞数组,其中每个元素都是该字典中的一个键。同样,如果您想要这些值,请使用 values
方法:
>> v = values(f);
v =
'Solarmew' 'YES!' 'hello'
请注意,keys
和 values
均不保证任何顺序。这意味着您添加键和值的顺序并不一定意味着您在调用 keys
或 values
时将获得相同的顺序。最后,如果你想从字典中删除一对key/value,使用remove
方法:
>> remove(f, -1.56);
>> k = keys(f)
k =
[3.1416] [5.1200]
>> v = values(f)
v =
'YES!' 'hello'
如您所见,与 Solarmew
关联的 -1.56
的键现已从字典中删除。
希望对您有所帮助!