我有两个数组,x
和y
。 x
是函数的输入,y
是函数值。
例如,x = [ 1 2 3 4 5 6 7 8 9 10]
,y = [ 3 6 2 4 1 6 7 0 1 8 ]
。两者的长度相同。
假设我有另一个包含z
的数组[ 2 3 8 9 10 3]
(与x
和y
的长度不同),
是否有任何函数产生输出[6 2 0 1 8 2]
(相应索引处的返回值)而不使用for循环遍历数组的每个元素?
非常感谢
edit1 *如果数组中的数字不是整数,我该怎么办?
答案 0 :(得分:0)
y(z)
这就是你所需要的......
答案 1 :(得分:0)
我认为你只是想要:
y(z);
这将返回y向量的第z个元素。你可能想要
y(x(z));
这将在您的示例中返回相同的结果,因为x
只是值1到10。
这两个z
只能包含正整数,而在第二种情况下x
也必须只包含正整数。
答案 2 :(得分:0)
如果您使用的是比2008b更新的MATLAB版本,您可以使用containers.Map类来执行您想要的操作,即使使用非整数,非连续或非数字值:
x = [ 1 2 3 4 5 6 7 8 9 10];
y = [ 3 6 2 4 1 6 7 0 1 8 ];
z = [ 2 3 8 9 10 3];
F = containers.Map(x,y);
% for a single element:
Fz1 = F(z(1))
% for multiple elements at the same time, you need to use arrayfun
Fz = arrayfun(@(x)(F(x)),z)
Map类实际上创建了一个所谓的hashmap,因此您可以将几乎任何值映射到其他值(例如字符串,单元格,数组......)。
当项目不存在时,将返回错误。
如果您不能使用MATLAB 2008b或更新版本,非整数域值有三种可能性。
使用interp1
等插值方法。这可能会给出错误的值(在预先未提供的值)。您可以使用ismember(z, x)
检查该案例。
其次,您可以发明自己的方案,从非整数到整数(例如,如果您的所有值都是0.5的倍数,乘以2),并使用Oli已经显示的解决方案。
另一个解决方案是使用struct
来模仿地图的行为。然后,您只需要从域值到有效字段名称的转换(即在MATLAB中作为有效变量名称的字符串,可以使用genvarname
函数)。
如果不考虑四舍五入,最后两个解决方案有点脏,容易出错。所以我认为它们只是最后的手段。