Sample QR decomposition Code (Python):

import numpy as np
import matplotlib.pyplot as plt

# Define the 2D array
data = np.array([
    [12, -51, 4],
    [6, 167, -68],
    [-4, 24, -41],
    [-1, 1, 0],
    [2, 0, 3]
], dtype=float)  # specify data type as 'float' to match C++ double




q, r = np.linalg.qr(data)
print(q)
print(r)

Sample QR-Decomposition C++ code (Eigen):

#include <iostream>
#include <Eigen/Dense>

void qrDecomposition(const Eigen::MatrixXd& A, Eigen::MatrixXd& Q, Eigen::MatrixXd& R) {
    int nRows = A.rows();
    int nCols = A.cols();

    Q = Eigen::MatrixXd::Zero(nRows, nCols);
    R = Eigen::MatrixXd::Zero(nCols, nCols);

    Eigen::MatrixXd v(nRows, nCols);
    Eigen::MatrixXd u(nRows, nCols);

    for (int j = 0; j < nCols; j++) {
        v.col(j) = A.col(j);
        for (int i = 0; i < j; i++) {
            R(i, j) = Q.col(i).dot(A.col(j));
            v.col(j) -= R(i, j) * Q.col(i);
        }
        R(j, j) = v.col(j).norm();
        Q.col(j) = v.col(j) / R(j, j);
    }
}

int main() {
    int nRows = 5;  // Number of rows
    int nCols = 3;  // Number of columns

    // Sample flattened array (replace with your data)
    Eigen::Map<Eigen::MatrixXd> A_data(new double[nRows * nCols], nRows, nCols);
    A_data <<
        12, -51, 4,
        6, 167, -68,
        -4, 24, -41,
        -1, 1, 0,
        2, 0, 3;

    Eigen::MatrixXd Q, R;

    qrDecomposition(A_data, Q, R);

    std::cout << "Matrix Q:\n" << Q << "\n";
    std::cout << "Matrix R:\n" << R << "\n";

    return 0;
}

RESULTS:

python results:

q
array([[-0.84641474,  0.39129081, -0.34312406],
       [-0.42320737, -0.90408727,  0.02927016],
       [ 0.28213825, -0.17042055, -0.93285599],
       [ 0.07053456, -0.01404065,  0.00109937],
       [-0.14106912,  0.01665551,  0.10577161]])
r
array([[ -14.17744688,  -20.66662654,   13.4015667 ],
       [   0.        , -175.04253925,   70.08030664],
       [   0.        ,    0.        ,   35.20154302]])

c++ results:

Matrix Q:
  0.846415  -0.391291  -0.343124
  0.423207   0.904087  0.0292702
 -0.282138   0.170421  -0.932856
-0.0705346  0.0140407 0.00109937
  0.141069 -0.0166555   0.105772
  
Matrix R:
 14.1774  20.6666 -13.4016
       0  175.043 -70.0803
       0        0  35.2015

PROBLEM:从上面的结果可以看出,这些值的符号是不同的(not always flipped).为什么会这样呢?

推荐答案

你在假设numpy正在使用Gram-Schmidt.documentation表明情况并不总是如此.他们提到了豪斯霍尔德、格拉姆-施密特和最小二乘法.如果你想了解它们的实际功能,可以参考here的源代码.您可以使用eigen通过其HouseHolder方法直接解决问题,您将看到eigennumpy返回相同的值.

   Eigen::Matrix<double, 5, 3> data;
   data << 12,-51,4,6,167,-68,-4,24,-41,-1,1,0,2,0,3;

   auto QR = data.householderQr();  //auto may not be efficient here...
   Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Q1 = QR.householderQ();
   Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> R1 = QR.matrixQR().triangularView<Eigen::Upper>();

    std::cout << Q1 << "\n\n" << R1 << "\n\n" << Q1 * R1 << std::endl;

输出为:

 -0.846415   0.391291  -0.343124  0.0661374 -0.0914621
 -0.423207  -0.904087  0.0292702  0.0173785 -0.0486104
  0.282138  -0.170421  -0.932856  -0.021942   0.143712
 0.0705346 -0.0140407 0.00109937   0.997401 0.00429488
 -0.141069  0.0166555   0.105772 0.00585613   0.984175

-14.1774 -20.6666  13.4016
       0 -175.043  70.0803
       0        0  35.2015      
       0        0        0      
       0        0        0      

        12        -51          4
         6        167        -68
        -4         24        -41
        -1          1 4.3715e-16
         2          0          3

您当然会注意到,eigen返回完整的Q矩阵,该矩阵可以被5x3的单位矩阵细化.如果你实现了HOUSTHOLDER,我想你会发现在本例中它会匹配numpy.

Python相关问答推荐

如何使用上下文管理器创建类的实例?

从DataFrame.apply创建DataFrame

如何处理嵌套的SON?

如何从FDaGrid实例中删除某些函数?

如何使用Google Gemini API为单个提示生成多个响应?

提取两行之间的标题的常规表达

将jit与numpy linSpace函数一起使用时出错

rame中不兼容的d类型

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

将pandas Dataframe转换为3D numpy矩阵

如何获取numpy数组的特定索引值?

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

Odoo 16使用NTFS使字段只读

让函数调用方程

dask无groupby(ddf. agg([min,max])?''''

为什么'if x is None:pass'比'x is None'单独使用更快?

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

PySpark:如何最有效地读取不同列位置的多个CSV文件

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

对于标准的原始类型注释,从键入`和`从www.example.com `?