我有两个数组,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]
的长度不同),是否有任何函数可以在不使用 for 循环遍历数组的每个元素的情况下产生输出(相应索引处的返回值)?x
y
[6 2 0 1 8 2]
太感谢了
edit1* 如果数组中的数字不是整数,我该怎么办?
我有两个数组,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]
的长度不同),是否有任何函数可以在不使用 for 循环遍历数组的每个元素的情况下产生输出(相应索引处的返回值)?x
y
[6 2 0 1 8 2]
太感谢了
edit1* 如果数组中的数字不是整数,我该怎么办?
我认为你只是想要:
y(z);
这将返回 y 向量的第 z 个元素。你可能想要
y(x(z));
这将在您的示例中返回相同的结果,因为x
只是值 1 到 10。
这两者都z
可以只包含正整数,而在第二种情况下x
也必须只包含正整数。
如果您使用的是 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
s 来模仿地图的行为。然后你只需要从你的域值转换为有效的字段名称(即在 MATLAB 中是有效变量名称的字符串,这可以通过使用该genvarname
函数来实现)。
如果不考虑四舍五入,这最后两个解决方案有点脏并且容易出错。所以我认为他们只是最后的手段。
y(z)
这就是你所需要的......