You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GLM中用3x3矩阵R为4x4矩阵M的3x3子矩阵赋值?

在GLM中为4x4矩阵的3x3子矩阵赋值的简洁写法

你需要把3x3矩阵R赋值给4x4矩阵M的左上3x3子区域,同时保留M原有的第4行和第4列,GLM提供了比两层循环更简洁的实现方式,以下是两种可行方案:

方法1:使用矩阵块操作(推荐)

GLM内置了子矩阵块操作的模板方法,直接定位目标子区域赋值即可,代码简洁且高效:

M.block<3, 3>(0, 0) = R;

这里的block<rows, cols>(startRow, startCol)函数指定了子矩阵的尺寸(3行3列)和起始位置(第0行第0列),直接将R的值覆盖到M的对应区域,完全无需手动循环。

方法2:手动拼接矩阵

如果需要更灵活的矩阵构造逻辑,可以先提取M中需要保留的部分,再和R拼接成新矩阵:

// 提取M第4列的前3个元素,以及完整的第4行
glm::vec3 preservedCol = glm::vec3(M[0][3], M[1][3], M[2][3]);
glm::vec4 preservedRow = M[3];

// 重新构造M:用R的行拼接保留的列元素,最后加上保留的第4行
M = glm::mat4(
    glm::vec4(R[0], preservedCol[0]),
    glm::vec4(R[1], preservedCol[1]),
    glm::vec4(R[2], preservedCol[2]),
    preservedRow
);

这种写法适合需要调整矩阵其他部分的场景,但对于你的需求,第一种块操作的方法显然更直接高效。

需要注意的是,这种方式和单纯将mat3转为mat4的逻辑不同——后者会用单位矩阵填充第4行和第4列,而上述两种方法都完整保留了M原本的第4行和第4列内容,完全符合你的要求。

内容的提问来源于stack exchange,提问作者tuket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:01:26