Eigen中transposeInPlace()和transpose()的使用详解和示例代码
特性类型成员函数成员函数返回值返回转置副本无返回值是否修改原矩阵❌ 否(保留原矩阵)✅ 是(原地转置)适用于方阵✅✅适用于非方阵✅❌ 仅适用于方阵使用场景保留原始数据,创建新矩阵需要节省内存,原地修改矩阵➜ 返回副本,不修改原矩阵,适用于所有维度。➜ 原地转置,仅限方阵,节省内存。非方阵请勿使用。可与memcpy配合用于与 OpenGL / DirectX / 自定义矩阵格式对接。
·
Eigen中transposeInPlace()和transpose()的使用详解和示例代码
在 Eigen 中,transpose() 和 transposeInPlace() 都用于矩阵转置,但它们的使用方式和场景略有不同。下面将详细解释两者的区别、适用场景及示例代码。
一、函数区别总结
| 特性 | transpose() |
transposeInPlace() |
|---|---|---|
| 类型 | 成员函数 | 成员函数 |
| 返回值 | 返回转置副本 | 无返回值 |
| 是否修改原矩阵 | ❌ 否(保留原矩阵) | ✅ 是(原地转置) |
| 适用于方阵 | ✅ | ✅ |
| 适用于非方阵 | ✅ | ❌ 仅适用于方阵 |
| 使用场景 | 保留原始数据,创建新矩阵 | 需要节省内存,原地修改矩阵 |
二、详细用法和示例
1. transpose() —— 返回一个转置后的新矩阵
示例:
#include <Eigen/Dense>
#include <iostream>
int main() {
Eigen::Matrix3f mat;
mat << 1, 2, 3,
4, 5, 6,
7, 8, 9;
Eigen::Matrix3f matT = mat.transpose(); // 返回新矩阵
std::cout << "Original:\n" << mat << "\n";
std::cout << "Transposed:\n" << matT << "\n";
return 0;
}
输出:
Original:
1 2 3
4 5 6
7 8 9
Transposed:
1 4 7
2 5 8
3 6 9
适合保留原始矩阵的应用场景,比如图像处理、缓存优化等。
2. transposeInPlace() —— 原地修改矩阵,仅限方阵
示例:
#include <Eigen/Dense>
#include <iostream>
int main() {
Eigen::Matrix3f mat;
mat << 1, 2, 3,
4, 5, 6,
7, 8, 9;
mat.transposeInPlace(); // 原地转置(只适用于方阵)
std::cout << "In-place Transposed:\n" << mat << "\n";
return 0;
}
输出:
In-place Transposed:
1 4 7
2 5 8
3 6 9
注意:非方阵(如
Matrix3x4f)调用transposeInPlace()会触发编译错误。
三、使用建议
| 使用目标 | 建议函数 |
|---|---|
| 不改变原始矩阵,需临时结果 | transpose() |
| 内存敏感,处理的是方阵 | transposeInPlace() |
| 处理非方阵 | 只能用 transpose() |
四、非方阵的 transpose 示例
Eigen::Matrix<float, 2, 3> mat;
mat << 1, 2, 3,
4, 5, 6;
Eigen::Matrix<float, 3, 2> matT = mat.transpose();
不能写成:
mat.transposeInPlace(); // ❌ 编译错误!
五、结合 memcpy 用法示例
Eigen::Matrix4f mat;
// ... fill mat
float* buffer = new float[16];
// 如果目标数组是 row-major,需转置
Eigen::Matrix4f temp = mat.transpose();
std::memcpy(buffer, temp.data(), sizeof(float) * 16);
总结
transpose()➜ 返回副本,不修改原矩阵,适用于所有维度。transposeInPlace()➜ 原地转置,仅限方阵,节省内存。- 非方阵请勿使用
transposeInPlace()。 - 可与
memcpy配合用于与 OpenGL / DirectX / 自定义矩阵格式对接。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)