首页 > 试题广场 >

基向量变换矩阵

[编程题]基向量变换矩阵
  • 热度指数:721 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在线性代数中,同一个向量可以在不同的基下表示。给定 \mathbb{R}^3 空间中两组基向量 BC,实现一个函数来计算从基 C  到基B 的变换矩阵 P

输入描述:
函数`transform_basis`接收两个参数:
1. B:3×3矩阵,表示第一组基向量(每列是一个基向量)
2. C:3×3矩阵,表示第二组基向量(每列是一个基向量)


输出描述:
返回一个 3 \times 3 的矩阵 P
示例1

输入

[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
[[1, 1, 0], [0, 1, 1], [1, 0, 1]]

输出

[[0.5, -0.5, 0.5], [0.5, 0.5, -0.5], [-0.5, 0.5, 0.5]]

备注:
1.对应的输入、输出已给出,您只用实现核心功能函数即可。
2.支持numpy、scipy、pandas、scikit-learn库。

从基C到基B的变换矩阵不应该是:

这里S是standard basis (自然基、标准基),所以

为啥答案里是反的啊?

发表于 2025-06-08 08:38:43 回复(0)
#include <iostream>
#include <Eigen/Dense>
#include <vector>

// 基向量变换函数
std::vector<std::vector<double>> transform_basis(const std::vector<std::vector<double>>& B, const std::vector<std::vector<double>>& C) {
    // 将 std::vector 转换为 Eigen::Matrix
    Eigen::MatrixXd eigenB(B.size(), B[0].size());
    Eigen::MatrixXd eigenC(C.size(), C[0].size());
    for (size_t i = 0; i < B.size(); ++i) {
        for (size_t j = 0; j < B[0].size(); ++j) {
            eigenB(i, j) = B[i][j];
            eigenC(i, j) = C[i][j];
        }
    }

    // 计算 C 的逆矩阵
    Eigen::MatrixXd C_inv = eigenC.inverse();

    // 计算 P = C_inv * B
    Eigen::MatrixXd P = C_inv * eigenB;

    // 将结果从 Eigen::Matrix 转换回 std::vector
    std::vector<std::vector<double>> result(P.rows(), std::vector<double>(P.cols()));
    for (int i = 0; i < P.rows(); ++i) {
        for (int j = 0; j < P.cols(); ++j) {
            result[i][j] = P(i, j);
        }
    }

    return result;
}

发表于 2025-03-28 16:53:52 回复(0)