这是一些 Octave 音阶代码
>> [4,5]([1,2,1])
ans =
4 5 4
我称之为将函数 1->4, 2->5 映射到向量 [1,2,1]。
但我想要做的映射是 0->1,25->2,240->9,NaN->0 在一个很长的向量上。
如果向量中存在除 0,25,240,NaN 之外的任何值,我也希望它会爆炸。
我可以看到多种方法来实现这一点,但没有一种方法很优雅,并且想知道是否有一种惯用的方式来表达它。
最佳答案
如果您会使用 MATLAB,我建议您使用 containers.Map
范例,本质上是一个执行键/值查找的关联数组。如果您输入不属于字典的值,它也会发出错误。因此,您只需为映射中的每个元素提供输入/输出关系即可。输入就是所谓的键,输出就是所谓的值。
完成后,您可以将输入值元胞数组提供到字典中/将数组与 values
关联起来。函数,然后在完成后将此元胞数组转换回数值向量。从您的输入/输出对来看,您希望输入为 double
,输出也为 double
。但是,containers.Map
的问题是 NaN
不能用作键。因此,解决方法是将输入数值向量中的每个元素转换为字符键元胞数组,并将输出定义为字符值元胞数组。
我们可以通过arrayfun
来实现这一点,它对数组中的每个值执行操作。这非常类似于 for
循环,但特殊之处在于,如果将 uni
标志指定为 0
,则每个对应的输出元素将被转换为字符串。然后,您可以使用这些字符元胞数组创建字典。现在,要对输入进行映射,您还必须将它们转换为字符元胞数组,然后使用 values
获取相应的输出,然后使用 str2double
将每个输出单元格元素转换回来并将其放入数值数组中。
因此,借用 Huntj 的示例输入,您必须执行以下操作:
%// Input-Output relationships
in = [0,25,240,NaN];
out = [1,2,9,0];
%// Test inputs
vector = [0, 25, 240, NaN, 0, 25, 240, NaN];
% // For declaring our dictionary
in_cell = arrayfun(@num2str, in, 'uni', 0);
out_cell = arrayfun(@num2str, out, 'uni', 0);
% // Input test into dictionary
vector_cell = arrayfun(@num2str, vector, 'uni', 0);
% // Create dictionary
dict = containers.Map(in_cell, out_cell);
% // Put in inputs to be mapped
output_cell = values(dict,vector_cell);
% // Convert back to numeric array
output = str2double(output_cell);
这就是我通过上面的代码得到的结果,最终输出存储在output
中:
output =
1 2 9 0 1 2 9 0
关于matlab - 如何在 Octave /matlab中执行 "map"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305882/