2012-03-28 3 views
2

dist=[1:100]; % distanceMatlabでループを使わずに効率的に書く方法はありますか?

% conc. is concentration of size 1x100

conc=1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.990000000000000 0.980000000000000 0.970000000000000 0.950000000000000 0.920000000000000 0.890000000000000 0.850000000000000 0.820000000000000 0.790000000000000 0.750000000000000 0.710000000000000 0.680000000000000 0.640000000000000 0.600000000000000 0.560000000000000 0.520000000000000 0.480000000000000 0.440000000000000 0.400000000000000 0.360000000000000 0.310000000000000 0.270000000000000 0.230000000000000 0.180000000000000 0.140000000000000 0.100000000000000 0.0700000000000000 0.0400000000000000 0.0200000000000000 0.0100000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

私はconcに0.16の濃度値(または可能な最も近い値)に対応するインデックスおよび0.84(または可能な最も近い値)を見つけたいです。私はそれらのインデックスでdistを見つけるためにそのインデックスを使用します。注意すべき点の1つは、concの値が、サイズ100のベクトルの非線形の関係で1から0に減少していることです。私たちはfind()を使用できると知っていますが、私はそれがどのようにして何をしたいのかには分かりません。

可能であれば、ループを使わずに効率的にやりたいと思っています。これは集中のためのベクトルがたくさんあり、コードにはすでに多くのループがあるからです。ありがとう。

答えて

3

簡単な解決策はiがインデックスを保持するまでの

[x, i] = min(abs(conc - 0.16)); 

です。これは、concベクトルのすべての要素を比較します。これは、データが順序付けられ、バイナリ検索を行うことができるため無駄ですが、matlabレベルで実装されたバイナリ検索は、100要素ベクトルの方が遅くなる可能性があります。

+0

恐ろしい!あなたはその単純なアルゴリズムで頭の爪を打つ。 – Pupil

+0

+1ニース。参考までに、私はベンチマークを伴うまともなMコードのbinsearchを持っています。ベンチマークでは、あなたの方法はビンサーチを数千要素まで上回ります。 (minはマルチスレッドであるためマシンに依存している可能性があります) –

+0

BTWは、 'min(abs(conc - 0.16) 'で得られる実際の値に加えて、出力に' i'インデックスがどのように含まれているか)) '?私の理解によれば、私は 'x'だけを得たはずです。 – Pupil

関連する問題