【问题标题】:Randomly Generate Orthogonal 3x3 Matrix随机生成正交 3x3 矩阵
【发布时间】:2012-02-01 23:53:11
【问题描述】:

我希望在 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.

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

【问题讨论】:

    标签: c# matrix orthogonal siemens-nx


    【解决方案1】:

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

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

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

    【讨论】:

    • 这实际上可能是朝着正确方向迈出的一步。我确实可以访问零件本身的绝对坐标系,因此完全可以接受变换。地狱,我相信已经有可用的方法。我花了很多时间思考如何做到这一点,但我忽略了最明显的答案。谢谢!
    【解决方案2】:

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

    有了这个,你只需要生成一个随机的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2016-06-30
      • 2019-10-14
      • 1970-01-01
      • 2017-03-26
      • 2015-11-26
      相关资源
      最近更新 更多