2

我有两个数组,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 循环遍历数组的每个元素的情况下产生输出(相应索引处的返回值)?xy[6 2 0 1 8 2]

太感谢了

edit1* 如果数组中的数字不是整数,我该怎么办?

4

3 回答 3

0

我认为你只是想要:

y(z);  

这将返回 y 向量的第 z 个元素。你可能想要

y(x(z));

这将在您的示例中返回相同的结果,因为x只是值 1 到 10。

这两者都z可以只包含正整数,而在第二种情况下x也必须只包含正整数。

于 2012-06-24T14:52:58.390 回答
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 显示的解决方案。

另一种解决方案是使用structs 来模仿地图的行为。然后你只需要从你的域值转换为有效的字段名称(即在 MATLAB 中是有效变量名称的字符串,这可以通过使用该genvarname函数来实现)。

如果不考虑四舍五入,这最后两个解决方案有点脏并且容易出错。所以我认为他们只是最后的手段。

于 2012-06-24T18:11:12.920 回答
0
y(z)

这就是你所需要的......

于 2012-06-24T14:43:17.350 回答