2直線の最短距離となる座標を算出したいです。
12 ビュー (過去 30 日間)
古いコメントを表示
2直線の最短距離座標を図を参考に算出しました。
係数s、tはsymsを用いて定義しました。
しかし、データ数が627912個もあります。
matlabを走らせると計算時間が12時間ほどかかりました。
もっと簡単な算出方法、短時間で計算ができるようなスクリプトを作りたいのですが、中々上手くいきません。
良い方法があれば教えてほしいです。

0 件のコメント
回答 (4 件)
Yoshio
2019 年 10 月 8 日
添付の図が見えませんので、良く分からない所がありますが、シンボリックが解をmatlabFunctionに変換できるので、一度数式で得られた解を数値計算向けの関数にして利用するのはどうでしょうか? 一度試してみてください。
Yoshio
2019 年 10 月 10 日
編集済み: Yoshio
2019 年 10 月 10 日
直線モデルを以下のように置く





よって

これを
について解くと


ここで

上記に基づき、ベクトル化を考慮してプログラムすると
% B,O,C,A = [x座標,y座標,z座標]
B=[39.8125,-0.9625,-198;39.9875,-1.8375,-198;39.9875,-0.9625,-198;39.9875,-0.7875,-198;40.1625,-7.2625,-198];
A=[-41.2125,-0.4375,-198;-41.2125,-0.2625,-198;-41.0375,-6.2125,-198;-41.0375,-0.9625,-198;-41.0375,-0.7875,-198];
C=[25,0,0];
O=[-25,0,0];
A = A';
B = B';
C = C';
O = O';
% A = rand(3,972);
% B = rand(3,646);
AA = repmat(A,1,size(B,2));
BB = reshape(repmat(B,size(A,2),1),3,size(B,2)*size(A,2));
v1 = AA-O;
v2 = BB-C;
P12 = O-C;
v1xv2 = cross(v1,v2);
d = abs(P12'*v1xv2./vecnorm(v1xv2));
tic
x1 = O;
x2 = C;
x12 = x1-x2;
v1v1 = sum(v1.*v1);
v1v2 = sum(v1.*v2);
v2v2 = sum(v2.*v2);
D = -v1v1.*v2v2 + v1v2.^2;
b = -[sum(v1.*x12);sum(v2.*x12)];
t1 = (-v2v2.*b(1,:)+v1v2.*b(2,:))./D;
t2 = (-v1v2.*b(1,:)+v1v1.*b(2,:))./D;
P1 = x1+t1.*v1;
P2 = x2+t2.*v2;
d0 = vecnorm(P1-P2);
toc
max(abs(d0-d))
min(abs(D))
972×646=627912の組だと約0.2秒でした
dとd0の差はepsの10倍程なので、合っているかと思います。なお、2つの直線が全く平行の場合は、D=0となり、解は不定となるので、この場合は別途考慮する必要がありますね。
8 件のコメント
Yoshio
2019 年 10 月 16 日
[1点目のAO直線に対するBC直線1~end、2点目のAO直線に対するBC直線1~end、・・・、end点目のAO直線に対するBC直線1~end]
という順番でならんでいる
という記述の意味がよくわからないのですが、MATLABの良さは、アイディアを簡単に試せる点にありますので、サンプルデータを作って、確認していただくのが良いかと思います。
参考
カテゴリ
Help Center および File Exchange で Encryption / Cryptography についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!