我正在尝试基于this paper by Müller et al.实现柔体物理。我在数学方面并不是非常糟糕,但在实施公式(7)时,我无法弄清楚语义。
它是这样的:
A = \left( \sum_i m_i p_i q_i^T) \right) \left( \sum_i m_i q_i q_i^T \right)^{-1}
with q_i and p_i being vectors (from center of mass current position,
to be exact)
(请原谅我的TeX)。这对我来说没有意义 - 矢量积的总和的乘积应该给出标量,但结果被视为矩阵。
在clojure(core.matrix)中直接实现公式给出了标量结果。
我尝试修改实现,将N向量p和q替换为零的NxN矩阵,将p和q替换为重复的第一行/列。这给了我矩阵结果,但是结果变换使我的坐标偏离了原来的位置。
有没有人有使用此算法的经验?
答案 0 :(得分:0)
这是clojure.core.matrix的实现,导致了这个问题。通常,列向量和行向量的乘积应该产生矩阵(而行向量和列向量的乘积产生标量)。
core.matrix在两种情况下都会返回标量,尽管其api文档另有说明。所以我不得不扩展强制乘法的技巧:
a1
mmul a2 (b1 b2 b3) = (mmul [[a1][a2][a3]] [b1 b2 b3])
a3 or (mmul [a1 a2 a3] [b1 b2 b3])
is done wrongly, so instead:
(a1 0 0) (b1 b2 b3)
mmul (b2 0 0) (0 0 0 ) = (mmul [[a1 0 0] [a2 0 0] [a3 0 0]]
(b3 0 0) (0 0 0 ) [[b1 b2 b3] [0 0 0] [0 0 0]] )