3

関数から見つけた値を含む Fa の配列があります。Matlab で関数を使用interp1して、特定の値が発生するインデックスを見つける方法はありますか? 対応するインデックス値を知ることinterp1で、配列内の特定の値を見つけることができるチュートリアルを見つけました。interp1

http://www.mathworks.com/help/matlab/ref/interp1.htmlの例:

次の 2 つのベクトルは、1900 年から 1990 年までの国勢調査の年と、対応する米国の人口 (数百万人) を表しています。

t = 1900:10:1990;
p = [75.995  91.972  105.711  123.203  131.669...
    150.697  179.323  203.212  226.505  249.633];

この式interp1(t,p,1975)は国勢調査データ内で内挿され、1975 年の人口を推定します。結果は次のとおりです。

ans =
    214.8585

-しかし、 214.8585tの値を見つけたいです。

4

5 に答える 5

2

ある意味では、関数のルートを見つけたいとします -

f(x)-val

まず、いくつかの答えがあるかもしれません。第 2 に、関数は区分線形であるため、関連する線形方程式を解くことで各セグメントを確認できます。

たとえば、次のデータがあるとします。

t = 1900:10:1990;
p = [75.995  91.972  105.711  123.203  131.669...
    150.697  179.323  70.212  226.505  249.633];

そして、値140を見つけたい

val = 140;    
figure;plot(t,p);hold on;
plot( [min(t),max(t)], [val val],'r');

ここに画像の説明を入力

val最初にからpの値を減算する必要があります。

p1 = p - val;

ここで、 ->から、またはその逆p1のいずれかで符号が変化するセグメントのみが必要です。+-

segments = abs(diff(sign(p1)==1));

これらの各セグメントで、関連する線形方程式を解き、a*x+b==0根を見つけることができます。それがあなたの価値の指標です。

for i=1:numel(segments)
    x(1) = t(segments(i));
    x(2) = t(segments(i)+1);
    y(1) = p1(segments(i));
    y(2) = p1(segments(i)+1);
    m = (y(2)-y(1))/(x(2)-x(1));
    n = y(2) - m * x(2);
    index = -n/m;
    scatter(index, val ,'g');
end

結果は次のとおりです。

ここに画像の説明を入力

于 2012-10-08T14:36:58.920 に答える
1

値をFa直接検索できます。

idx = Fa==value_to_find;

インデックス使用find関数を見つけるには:

find(Fa==value_to_find);

もちろん、これvalue_to_findは が に存在する場合にのみ機能しFaます。しかし、私が理解しているように、これはあなたが望むものです。その必要はありませんinterp

一方、値が に存在しない可能性があるFaが、Fa並べ替えられている場合は、より大きい値を検索してvalue_to_find、そのような最初のインデックスを取得できます。

find(Fa>=value_to_find,1);

問題がそれよりも複雑な場合は、Andreys answer を見てください。

于 2012-10-08T14:38:13.960 に答える
1

Andrey のソリューションは原則として機能しますが、ここに示すコードは機能しません。問題は、0 と 1 のベクトルを生成するセグメントの定義にあり、その後、「t(segments(i))」を呼び出すとエラーが発生します (コードをコピーして貼り付けようとしました。その単純なタスクで失敗しないでください)。

セグメントの定義を少し変更しました。よりエレガントに仕上げることができます。ここにあります:

t = 1900:10:1990;
p = [75.995  91.972  105.711  123.203  131.669...
    150.697  179.323  70.212  226.505  249.633];

val = 140;    
figure;plot(t,p,'.-');hold on;
plot( [min(t),max(t)], [val val],'r');

p1 = p - val;

tn = 1:length(t);
segments = tn([abs(diff(sign(p1)==1)) 0].*tn>0);

for i=1:numel(segments)
    x(1) = t(segments(i));
    x(2) = t(segments(i)+1);
    y(1) = p1(segments(i));
    y(2) = p1(segments(i)+1);
    m = (y(2)-y(1))/(x(2)-x(1));
    n = y(2) - m * x(2);
    index = -n/m;
    scatter(index, val ,'g');
end
于 2014-10-12T07:36:22.627 に答える
0

最も一般的なケースに対する答えは上記の Andrey によって与えられたものであり、私はそれに同意します。あなたが述べた例では、単純な特定の解決策は次のようになります。

interp1(p,t,214.8585)

この場合、特定の人口がわかっている年について解決しています。

複数のソリューションがある場合、このアプローチは機能しません。Andrey の値でこれを試すと、問題の最初の解決策しか得られません。

于 2012-10-08T18:52:23.890 に答える
0

関数全体をより高い精度で補間します。次に、検索します。

t = 1900:10:1990;
p = [75.995  91.972  105.711  123.203  131.669...
    150.697  179.323  203.212  226.505  249.633];

precision = 0.5;
ti = 1900:precision:1990;

pi = interp1(t,p,ti);

現在、pi は半年ごとにすべての pi 値を保持しています。max(ti(pi < x))値が常に増加すると仮定すると、 where で年を見つけることができますx = 214.8585。ここで、pi < x は、ti をフィルタリングして、p が x より小さい年のみを提供するために使用される論理ベクトルを作成します。次に、max() を使用して最新の年を取得します。これは、p が常に増加しているという仮定が成り立つ場合、x に最も近い年になります。

于 2012-10-08T14:43:30.677 に答える