tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

空間分割アルゴリズム

三角形に分割された閉曲面(球面)と複数の半直線があったとき、それぞれが交差するかどうかの判定をしたい。レイトレーシングで使用されるようなアルゴリズムとしてはAABB、Quadtree、Octreeなどが見つかった。BVH (Bounding Volume Hierarchies)で領域を木構造に分割してAABBで交差を判定する方法は、空間にまばらにオブジェクトがある場合では木構造が定めやすくなり有効だと思われる。今回の用途だと、三角形は球面を全て埋め尽くしているため半直線は必ずいずれかの三角形と交差するし、頂点の座標は極座標で与えれば2次元である。そのため、四分木がちょうど良いだろうと考えている。(とはいえ実装は出来れば回避したく、たぶん使わないのでこのページは開きすぎたタブの供養にあたる)

続きを読む

三角メッシュ用のライブラリ書いた

GitHub - tak0kada/cnthd: Halfedge data structure for triangular mesh
ハーフエッジデータ構造のC++ライブラリ。面の向き付けがバラバラなファイルに対応しようと思っていたがバグを出してしまって(しかもそれほど使わない機能)書き直す時間が惜しいのでまともなファイルが来るのが前提になっている。テストもいい加減で目視で確かめただけである。以下は使用例。

続きを読む

n単体の作り方

$(1,1,\ldots,1)^{t}$をQR分解して得られるQ因子は直交行列でかつ、1列目が等しい。ここからn個のn-1次元行ベクトルを取ると、n単体が得られる。 お気持ち証明としては、n個の正規直交基底を、ある1つの次元$z$の値が同じになるように取って、その後その次元$z$の向きに正射影したものを考えるとそんな気がしてくる。

# https://mathoverflow.net/questions/38724/coordinates-of-vertices-of-regular-simplex
simplex <- function(n) {
    qr.Q(qr(matrix(1,nrow=n)),complete=T)[,-1]
}

pythonで.RDataファイルの中身(array)を読み込む

import rpy2.robjects as ro

# RDataの中に入っているデータについている名前は事前にRで確認しておく
# arrayの次元はhoge$dimで取れないので下記リンクと異なる
ro.reval("load(\"test.RData\"); data<-hoge; shape<-dim(hoge)")

# https://stackoverflow.com/questions/31271181/how-to-convert-an-r-complex-matrix-into-a-numpy-array-using-rpy2
data = np.array(list(ro.r.data)).reshape(ro.r.shape, order='F')
print(data.shape) # (3, 90795, 441)

Wasserstein距離

https://twitter.com/yoriyuki/status/1126423987444015104を見かけた。Wassersteinとは何か調べると、Wasserstein GAN と Kantorovich-Rubinstein 双対性という記事を見つけた。DeepLearningは理解していないが、線形代数的な話題として捉えられるらしい。

  • 距離関数を適切に(どうやって?)定められたとすると、
    • 離散確率分布の距離をEMDとして定義できる
    • 極限を取ったものがWasserstein距離になる
  • EMDを計算するためには輸送にかかるコストを計算することになる
    • 双対問題を考えると、全コストの計算をせずにEMDを計算できる
    • 双対問題を解くので十分な理論的な根拠はFarkasの補題というものが保証している
  • 後半の議論は疲れたのでフォローできていない

次元によらず確率分布の距離を測る方法としてOptimal transportが使われるという話は聞いていたが、Earth mover's distanceと直接関係があるとは知らなかった。EMDはかなりプリミティブな概念だが、プリミティブなものを軽視してはいけないという反省が生じた。この手法だと、確率分布の比較は出来るが、時系列のような確率分布を並べたものを生成する規則があるとして、その規則そのものの距離はそのままでは測れないという制限がありそう。

dockerコマンドメモ

docker login
docker pull archlinux/base
docker build -t antergos_base .
docker -it --rm antergos_base bash

docker save antergos_base > antergos_base.tar # tag情報は保存されない
docker load < antergos_base.tar
# need afterwards: docker tag 6834.... hoge/hoge:latest

docker export antergos_base > antergos_base.tar
docker import antergos_base.tar antergos_base

docker image ls
docker ps -a
docker rm $(docker ps -aq)
docker image rm id

球面調和関数係数(3 x n行列)の可視化

3次元空間にひと塊の形(球と同相)があって、その表面上の点の集合を考える。何らかの方法で塊は球面に変形できて、その変形に伴って点の集合は球面上に写される、と考える。その時、元のX、Y、Z座標をそれぞれ球面上の分布($S^{2} \to \mathrm{R}$)と考えると、これは球面調和関数で分解できることになる。3つ係数の列が取れるので、それを3xnの行列とする。これを元の塊の表面に戻すのは、係数を使って色々の$\theta$、$\phi$についてX、Y、Zを計算してやるだけで良い。

続きを読む