C/C++ 矩阵的QR分解

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;


int main() /* 矩阵A的QR分解*/
{


    // 动态分配内存
    int m = 3; // 行数
    int n = 3; // 列数


    // 初始化矩阵A
    double A[3][3] = {
        {1, 2, 2},
        {2, 1, 2},
        {1, 2, 1}
    };

    double R[3][3] = { 0 };
    double Q[3][3] = { 0 };



    cout << "A:" << endl; //输出矩阵A
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%.4f ", A[i][j]);
        }
        cout << endl;
    }

    for (int k = 0; k < n; k++)
    {
        double MOD = 0;
        for (int i = 0; i < n; i++)
        {
            MOD += A[i][k] * A[i][k];
        }
        R[k][k] = sqrt(MOD); // 计算A第k列的模长,由公式(4)等于R的对角线元素||A:k||
        for (int i = 0; i < n; i++)
        {
            Q[i][k] = A[i][k] / R[k][k]; // 由公式(2),A第k列标准化之后成为Q的第k列
        }

        for (int i = k + 1; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                R[k][i] += A[j][i] * Q[j][k]; // 由公式(4),计算R的上三角部分
            }
            for (int j = 0; j < n; j++)
            {
                A[j][i] -= R[k][i] * Q[j][k]; // 由公式(1),计算更新A的每一列
            }
        }
    }

    cout << endl;
    cout << "Q:" << endl; //输出矩阵Q
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%.4f ", Q[i][j]);
        }
        cout << endl;
    }

    cout << endl;
    cout << "R:" << endl; //输出矩阵R
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%.4f ", R[i][j]);
        }
        cout << endl;
    }

    return 0;
}




//动态分配内存

//int main3() /* 矩阵A的QR分解*/
//{
//
//
//    // 动态分配内存
//    int m = 3; // 行数
//    int n = 3; // 列数
//    double** A = (double**)malloc(m * sizeof(double*));
//    double** Q = (double**)malloc(m * sizeof(double*));
//    double** R = (double**)malloc(n * sizeof(double*));
//
//    for (int i = 0; i < m; i++) {
//        A[i] = (double*)malloc(n * sizeof(double));
//        Q[i] = (double*)malloc(n * sizeof(double));
//        R[i] = (double*)malloc(n * sizeof(double));
//    }
//
//    // 初始化矩阵A
//    double A_values[3][3] = {
//        {1, 2, 2},
//        {2, 1, 2},
//        {1, 2, 1}
//    };
//
//    for (int i = 0; i < m; i++) {
//        for (int j = 0; j < n; j++) {
//            A[i][j] = A_values[i][j];
//        }
//    }
//
//
//    // 初始化矩阵A
//    double A[3][3] = {
//        {1, 2, 2},
//        {2, 1, 2},
//        {1, 2, 1}
//    };
//
//    double R[3][3] = { 0 };
//    double Q[3][3] = { 0 };
//
//
//
//    cout << "A:" << endl; //输出矩阵A
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", A[i][j]);
//        }
//        cout << endl;
//    }
//
//    for (int k = 0; k < n; k++)
//    {
//        double MOD = 0;
//        for (int i = 0; i < n; i++)
//        {
//            MOD += A[i][k] * A[i][k];
//        }
//        R[k][k] = sqrt(MOD); // 计算A第k列的模长,由公式(4)等于R的对角线元素||A:k||
//        for (int i = 0; i < n; i++)
//        {
//            Q[i][k] = A[i][k] / R[k][k]; // 由公式(2),A第k列标准化之后成为Q的第k列
//        }
//
//        for (int i = k + 1; i < n; i++)
//        {
//            for (int j = 0; j < n; j++)
//            {
//                R[k][i] += A[j][i] * Q[j][k]; // 由公式(4),计算R的上三角部分
//            }
//            for (int j = 0; j < n; j++)
//            {
//                A[j][i] -= R[k][i] * Q[j][k]; // 由公式(1),计算更新A的每一列
//            }
//        }
//    }
//
//    cout << endl;
//    cout << "Q:" << endl; //输出矩阵Q
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", Q[i][j]);
//        }
//        cout << endl;
//    }
//
//    cout << endl;
//    cout << "R:" << endl; //输出矩阵R
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", R[i][j]);
//        }
//        cout << endl;
//    }
//
//    // 释放内存
//    for (int i = 0; i < m; i++) {
//        free(A[i]);
//        free(Q[i]);
//    }
//    for (int i = 0; i < n; i++) {
//        free(R[i]);
//    }
//    free(A);
//    free(Q);
//    free(R);
//
//    return 0;
//}





//
//int main1() /* 矩阵A的QR分解*/
//{
//    vector<vector<double>> a = { {1,2,2},{2,1,2},{1,2,1} };
//    int n = a.size();
//    vector<vector<double>> q(n, vector<double>(n));
//    vector<vector<double>> r(n, vector<double>(n));
//
//
//
//    cout << "A:" << endl; //输出矩阵A
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", a[i][j]);
//        }
//        cout << endl;
//    }
//
//    for (int k = 0; k < n; k++)
//    {
//        double MOD = 0;
//        for (int i = 0; i < n; i++)
//        {
//            MOD += a[i][k] * a[i][k];
//        }
//        r[k][k] = sqrt(MOD); // 计算A第k列的模长,由公式(4)等于R的对角线元素||A:k||
//        for (int i = 0; i < n; i++)
//        {
//            q[i][k] = a[i][k] / r[k][k]; // 由公式(2),A第k列标准化之后成为Q的第k列
//        }
//
//        for (int i = k + 1; i < n; i++)
//        {
//            for (int j = 0; j < n; j++)
//            {
//                r[k][i] += a[j][i] * q[j][k]; // 由公式(4),计算R的上三角部分
//            }
//            for (int j = 0; j < n; j++)
//            {
//                a[j][i] -= r[k][i] * q[j][k]; // 由公式(1),计算更新A的每一列
//            }
//        }
//    }
//
//    cout << endl;
//    cout << "Q:" << endl; //输出矩阵Q
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", q[i][j]);
//        }
//        cout << endl;
//    }
//
//    cout << endl;
//    cout << "R:" << endl; //输出矩阵R
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            printf("%.4f ", r[i][j]);
//        }
//        cout << endl;
//    }
//
//    return 0;
//}
//

Matlab

相关推荐
优雅的潮叭1 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计1 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
月挽清风2 小时前
代码随想录第七天:
数据结构·c++·算法
不大姐姐AI智能体2 小时前
搭了个小红书笔记自动生产线,一句话生成图文,一键发布,支持手机端、电脑端发布
人工智能·经验分享·笔记·矩阵·aigc
csdn_aspnet3 小时前
C 语言的优雅回归:从零手造数据结构
c语言·数据结构
点云SLAM3 小时前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
浅念-3 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
想放学的刺客4 小时前
单片机嵌入式嵌入式试题(第16期):硬件可靠性设计与复杂状态机架构设计
c语言·stm32·单片机·嵌入式硬件·物联网
无限进步_5 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
巨大八爪鱼5 小时前
C语言纯软件计算任意多项式CRC7、CRC8、CRC16和CRC32的代码
c语言·开发语言·stm32·crc