2

私は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 ]。どちらも同じ長さです。

( and と同じ長さではない)zを含む別の配列があるとします。配列の各要素に対して for ループを使用せずに出力(対応するインデックスで値を返す) を生成する関数はありますか?[ 2 3 8 9 10 3]xy[6 2 0 1 8 2]

どうもありがとう

edit1* 配列内の数値が整数でない場合はどうすればよいですか?

4

3 に答える 3

0
y(z)

それだけでいい……

于 2012-06-24T14:43:17.350 に答える
0

私はあなたがただ欲しいと思います:

y(z);  

これは、y ベクトルの z 番目の要素を返します。あなたが望むかもしれません

y(x(z));

x値は 1 ~ 10 であるため、この例では同じ結果が返されます。

これらの両方でz正の整数のみを含めることができ、2 番目のケースで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 クラスは実際にいわゆるハッシュマップを作成するため、ほとんどすべての値を他の値 (文字列、セル、配列など) にマップできます。

アイテムが存在しない場合、エラーが返されます。

MATLAB 2008b 以降を使用できない場合、整数以外のドメイン値には 3 つの可能性があります。

などの補間方法を使用しinterp1ます。これにより、誤った値が返される可能性があります (事前に提供されていない値で)。を使用してそのケースを確認できますismember(z, x)

次に、非整数から整数への独自のスキームを発明し (たとえば、すべての値が 0.5 の倍数の場合は 2 を掛ける)、Oli が示したソリューションを使用できます。

もう 1 つの解決策はstruct、マップの動作を模倣するために s を使用することです。genvarname次に、ドメイン値から有効なフィールド名 (つまり、関数を使用して可能な MATLAB の有効な変数名である文字列) への変換のみが必要です。

これらの最後の 2 つのソリューションは、丸めを考慮しないと、多少汚れており、エラーが発生しやすくなります。したがって、私はそれらを最後の手段としてのみ見ています。

于 2012-06-24T18:11:12.920 に答える