matlab - 如何在 Octave /matlab中执行 "map"?

标签 matlab function dictionary octave

这是一些 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/

相关文章:

matlab - 神经网络训练matlab parfor问题

matlab - clear(Filename) 在 MATLAB 中做什么?

performance - MATLAB:如何有效地创建一个矩阵,这是外积的结果?

function - 反向函数和 append 函数到自定义列表标准 ml

mysql - 在 MySQL 中创建一个用户定义的函数来处理 auto_increment

dictionary - 免费提供中文、日文、中日韩字符字典数据

python - 在Python中处理大型字典和数据帧

image - 如何根据矩阵值检测图像的一部分?

c - 编写一个函数来检查其参数(正整数)是否是完全平方数。然后将此函数应用于正整数 vector

c++ - 将 vector 放入 map