• 締切済み

MATLABでマハラノビスの距離から楕円を描く方法が分からず困ってます。

MATLABでマハラノビスの距離から楕円を描く方法が分からず困ってます。 現在研究で移動物体の位置推定を行っています。 プログラムソフトはMATLABを使っています。 その位置推定が正確かどうかの指標として、マハラノビスの距離を求め、二次元平面上に楕円を描き、移動軌跡がその楕円内にあるかを確認することが今後必要になります。 そのため、楕円をプログラムでプロットする必要があるのですが、その方法が分からず困っています。 些細なことでも構いませんので、回答していただけるとありがたいです。

みんなの回答

  • sinisorsa
  • ベストアンサー率44% (76/170)
回答No.2

#1です。手元でmatlabが使えないので、方針だけ書きましょう。 (1)Σの固有値問題を解く  確かeigenという関数があったと思います。helpをみてください。 [L,P]=eigen(S); だったかな?(もしかするとLとPの順序が逆?)  Lは固有値を対角要素とする行列  固有値をL1、L2とします。  Pは固有ベクトル行列 すなわち、直交行列  P’P=I(単位行列)ゆえに P^(-1)=P’ (2)X=Pxとすると(y=0として)  X=[X1,X2]’として、楕円の方程式は、   (X1^2/L1)+(X2^2/L2)=c となりますから、a=sqrt(c*L1)、b=sqrt(c*L2)とすると、 aとbは楕円の長短の径となります。 (3)グラフ化の処理 n=0:200; dw=2*pi/200; (2πを200分の1) w=dw*n; (0~2πの200等分点) X1=a*cos(w); X2=b*sin(w); このまま、plot(X1,X2)でグラフを描くと長短径が座標軸方向と なっていますから、 後はP'で回転しましょう。 X1,X2が行ベクトルか列ベクトルだったか未確認なので、 一応列ベクトルだとして、(行だったら転置してください) X=[X1 X2]; 元の座標系に戻すには、 x=P’X; xの第1列のベクトルをx1と第2列のベクトルをx2として、 plot(x1,x2); 元の座標軸での楕円になると思います。 うる覚えで書いていますから、helpを参照してください。 参考になれば幸いです。

dattct03s
質問者

お礼

丁寧な回答ありがとうございました。 おかげでグラフ化も行うことができました。 今回の回答で理解したことを今後も研究の参考にさせていただきます。

  • sinisorsa
  • ベストアンサー率44% (76/170)
回答No.1

マハラノビスの距離というのは、 d(x,y)=(x-y)'Σ^(-1)(x-y) でいいでしょうか? ’は転地です。 楕円を描くというのは、yを原点に取って、 d(x,y)=c(一定)のグラフを描くということでしょうか? 一定値cはどのように決めますか。 一応、cは決めたとして、 ΣをP'ΛPに分解する。Σの固有値、固有ベクトルを求め Λは、対角行列で、固有値が対角要素。 Pは固有ベクトルを並べた行列。 X-Y=P(x-y)と置くと、d(x,y)=(X-Y)'Λ(X-Y)=c となります。これは、長径、短径が座標軸に平行となります。 これをもとに楕円を描けるので、P’を使って座標を回転すれば よいでしょう。 固有値問題はMatlabに関数があるでしょう。 座標回転は行列の掛け算。 とりあえず、思いつくままに。

dattct03s
質問者

補足

回答ありがとうございます。 もう少し詳しく書いておくべきでした。 マハラビスの距離は、d(x,y)=(x-y)'Σ^(-1)(x-y)の式です。 楕円はyを原点に取って、c=(一定)描きます。 楕円は「95%信頼楕円」として考えるので、c=2.45くらい(違うかもしれません)で描きます。 式の意味はある程度理解できました。 しかし、まだPを決めて楕円を回転させる方法がよく分かりません。 適当な式でいいのでその例(MATLABのプログラム)を挙げて頂けると助かります。

関連するQ&A

  • MATLABの使い方について

    プログラム超初心者です。 MATLABを使って3次元方程式をプロットしたいのですが基本的なやり方がいろいろわかってなくて困ってます。1から学ぶことのできるようないい解説サイトなどないでしょうか? ちなみに具体的にやりたいこととしてはいくつかあるのですが、ローレンツ方程式などをルンゲクッタ法で解いてプロットする、とかそんな感じです。このやり方についてだけでも示していただけたら幸いです。

  • MATLABのプログラミングについて

    マウスのカーソルの移動距離を計測したいのですが、 MATLABでできますでしょうか。 プログラムでどう組み込めばよいのか分らないため質問させて頂きました。 MATLAB初心者のため、詳しい方ご教授のほどお願いします。 左クリック(開始)→マウスを動かす→左クリック(終了) のようにクリックからクリックまでの移動距離を計測したいのです。 できれば、マウスカーソルの軌跡も表示させたいです...。 丸投げで聞いてしまい申し訳ないのですが、 緊急で必要になったため、質問させていただきました。 以下の環境を使っています。  -Windows 7  -R2010b

  • 傾いた楕円の描画方法

    PCでの楕円の描画は、ライブラリに組み込まれていますが、水平(または垂直)の楕円については、関数1行で描画することができます。 ところが、傾いている楕円については、描画することができません。 そこで、ミッチェナーのアルゴリズムで円を描くプログラムを変形して、上下(左右)のプロット位置をずらせば、一応、楕円は描画できるので、さらにプロットする部分に回転をかければ回転した楕円を描画できると考えて、プログラムを作成してみました。 しかし、あまり綺麗な楕円を描画できません。 ミッチェナーのアルゴリズムを上下に圧縮した時点で、左右の部分が少し密になり(これは許容できる範囲ですが)それを回転させるとき、実数計算になるため、最終的な位置は、ドットのどちらかになってしまうので、あまりうまくいきません。 ミッチェナーのあるごりずむの原理を使って、傾いた楕円の式から、直接プロットしなければ綺麗な楕円を描画することができないと考えます。 最終的に欲しい関数は、傾いた楕円の外接する4点の座標を与えて、描画する関数です。

  • MATLAB及びSCILABについて

    scilabで以下の式について二次元でプロット化したいのですが、全くわかりません。 ... matlabでも結構ですので、プログラムの書き方がわかる方教えていただけませんか? ちなみにmkとnkは nk=3^(3^k) mk=2*k*nk で与えられています。 何か参考になることでもいいですので、よろしくお願いします。

  • 楕円内の任意の点から楕円周までの最短距離

    長半径がaで、短半径がbである楕円内に、ランダムに点(座標X0,Y0)をプロットし、その点から楕円周までの最短距離をperlを使って計算したいと思っています。 最終的には、最短距離の分布がどのようになっているのかを求めたいと思っています。   この計算の結果は、細胞の形を楕円に近似したときに、特定の組織の位置がランダムな場所にあるのか、細胞の表面近くに存在する傾向があるのかを調べるためのコントロールデータとして使う予定でいます。   しかし、座標X0,Y0から、楕円周までの最短距離をどのようにして計算したらよいのか見当もつきません。計算過程は省いていただいても構いませんので、最終的にどのような式を使えば計算できるのか、教えていただけないでしょうか。 よろしくお願いします。

  • MATLABで外れ値をプロットする方法を教えてくだ

     MATLABで外れ値をプロットする方法を教えてください。  具体的には下記のとおりです。  MATLABで、中央値+中央値から±20%離れた時系列データをプロットするにはどうすればよいでしょうか? 冗長なprogramしか作成できないため、よい関数か、方法があれば教えていただきたく思い、 質問しました。 まず、時系列データですが、数十万点数からなる信号になっています。 この信号の中央値をだし、その中央値から±20%の範囲でひっかかるデータをplotしたく思っています。 中央値算出は、関数を知っていますので処理が早いのですが中央値から±20%の範囲でひっかかるデータをプロットするのにいまは、以下のような考えで行っています。 行データ、size(x(:)) ans=:1000000 1とおきます。 まず、 1)中央値を求める。 2)median+20%、median-20%を求める。 3) hold on;  for i=1:1:data-length   if(x(i)<=median-20% & x(i)>=median+20%) plot x(i) endif  end というようにしています。しかし、これではデータ一点一点検討する必要があるので冗長で、処理に時間が かかります。 そのため、for文を使わずに、 medi-20(:)=function(x(:),median-20) medi+20(:)=function(x(:),median+20) で計算できるような、関数functionを教えていただけると幸いです。 よろしくお願いします。

  • 楕円の焦点のユニーク性について

    与えられた2定点FF'からの距離の和が一定値kである点の軌跡は 楕円Cになるとします。これを(FF',k)⇒Cと書くことにします。 もし(GG',k)⇒CならFF'とGG'は一致する。 あるいはk'≠kで(GG',k')⇒CならFF'とGG'は一致する。 この証明を教えてください。 (xy平面でルート使って試みましたがgiveupです。本質的な 証明方法があるのでしょうか?)

  • 一平面上で2定点(焦点)からの距離の和が一定な点

    一平面上で2定点(焦点)からの距離の和が一定な点の軌跡が楕円である。このことを使って、 回転楕円体の1つの焦点に置いた点光源から出た光はすべてもう一つの焦点に集まることを示せ(焦点の名はこれに由来する)。 どなたか教えてください。

  • 物理 速さと移動距離 問題

    X軸上を一定の速度0.5(m/s)で運動している物体を考える。ここで、この物体は0(s)のときに0(m)の位置を通過したとする。 (1)画像のようにv-tグラフにおける囲まれた面積を計算するやり方で、0(s)から4(s)までに物体が移動する距離を求めなさい。また、4(s)のときの物体の位置を求めなさい。 物体が移動する距離は2mになったのですが、4(s)のときの物体の位置の求め方がよく分かりません。解き方を教えてください。

  • 【Matlab】画像として保存するとplot3による点が消えてしまう

    【Matlab】画像として保存するとplot3による点が消えてしまう ----------------------------------------------------------------------------------- 最近Matlabを使用し始めた初心者です。よろしくお願いします。 surf出力とplot3による点が見える形で画像を出力したいと思っています。 画像はグラフを真下からのぞいたものとし、自動的に保存したいです。 自分の稚拙なプログラムではどうしてもプロットによる点が現れません。 対策をご教授いただきたいです。 プログラムの内容は、 二次元データをcsvから読み込み、surfで出力、 またデータ上のある座標での出力をplot3で点として表示するという流れを意図しています。 'Figure'ウィンドウ上(.fig)ではplot3で出力された点が表示されるのですが 画像(bmp,tiffで出力してみました)として出力した場合その点が消えてしまいます。 mファイルのプログラム、環境は以下のようになっています。 function test_show_graph(csvfilename) %------------------------------------ z = csvread(csvfilename); [height, width] = size(z); [x,y] = meshgrid(0:0.1:(height*0.1)); h_surf = surf(x,y,z); hold on zi = interp2(x,y,z,4,4, 'cubic'); plot3(4.0,4.0,zi+10,'.r','MarkerSize',30); plot3(4.0,4.0,zi-10,'.r','MarkerSize',30); hold off view([0, -90]); saveas(h_surf, 'test', 'tiff'); %Matlab&Simulink R2008a %WindowsVista SP1 %Dell StuioXPS(Intel Core i7) surfの表面に隠れて点か見えなくなっていると思い、 表面の上下に突き抜けるようにlineを出力してみたりしてみましたがダメでした。 駄文となり申し訳ありません。 皆様の知識をお借りできれば幸いです。