随机生成正交3x3矩阵

时间:2012-01-04 00:54:35

标签: c# matrix orthogonal siemens-nx

我希望在Seimens NX中进行一些复杂的零件分析。我正在寻求实施测量模型的双卡尺方法,以便找到它可能适合的最小可能的盒子(用于加工目的)。我已经完成了所有的测量代码,但是我完全不知道可以随机输出规范化的3x3矢量用作坐标系的构造。该部件是相对于该坐标系测量的,因此每个坐标系给出一个唯一的“最小部件包络”。分析后,选择并显示最小的包络。

this is the type of vector I am talking about:
1 0 0
0 1 0
0 0 1

numbers can be any value between -1 and 1, with decimals not only being accepted but pretty much required.

不,这不是我的功课。在我工作的空闲时间里,更多的是个人追求。

2 个答案:

答案 0 :(得分:2)

如果将旋转矩阵应用于已经正交的矩阵,则结果也应该是正交的。

因此,您可以将问题重新定义为将随机旋转矩阵应用于单位矩阵。

也许为每个轴(x,y,z)做一个随机旋转矩阵,然后以随机顺序应用矩阵本身?

答案 1 :(得分:1)

如果你不介意只考虑正交矩阵的一个特殊子集,有一个更简单的方法来实现这一点,那就是利用 Rodrigues' rotation formula 来生成 rotation matrices(它有一个额外的约束,它的行列式等于 1)。

Image of the Rodrigues' rotation formula

Image of the bracket notation

有了这个,你只需要生成一个随机的 3x1 单位向量(作为旋转轴)并指定一个旋转角度。此公式会将它们转换为有效的旋转矩阵。

MATLAB 示例:

function R = rot(w, theta)
  bw = [0, -w(3), w(2); w(3), 0, -w(1); -w(2), w(1), 0];
  R = eye(3) + sin(theta)*bw + (1-cos(theta))*bw*bw;
end

w = rand(3,1)
w = w/norm(w)
R = rot(w, 3.14)

C++ 示例:

// w: the unit vector indicating the rotation axis
// theta: the rotation angle in radian
Eigen::Matrix3d MatrixExp3 (Eigen::Vector3d w, float theta){
  Eigen::Matrix3d bw, R;
  bw << 0, -w(2), w(1), w(2), 0, -w(0), -w(1), w(0), 0;
  R << Eigen::Matrix3d::Identity() + std::sin(theta)*bw + (1-std::cos(theta))*bw*bw;
  return R;
}

int main() {
  std::srand((unsigned int) time(0));
  Eigen::Vector3d w = Eigen::Vector3d::Random();
  Eigen::Matrix3d R = MatrixExp3(w.normalized(), 3.14f);
  std::cout << R << std::endl;
}