数据结构-矩阵

介绍

数据结构中的矩阵主要涉及以下几种:

  1. 对称矩阵:若矩阵A n*n中的元素特点是a[ij]=a[ji],则称之为n阶对称矩阵。对称矩阵的每一对元素占用一个存储单元,那么对于n阶矩阵,可以压缩到n(n+1)/2个元素的存储单元。
  2. 对角矩阵:对角矩阵是指矩阵中的非0元素都集中在以主对角线为中心的带状区域。也就是除了主对角线和直接在对角线上、下方若干条对角线上的元素除外,其余的元素均为0。
  3. 三角矩阵:包括上三角矩阵和下三角矩阵。上三角矩阵的对角线以下(不包括对角线)的元素均为常数0;下三角矩阵的对角线以上(不包括对角线)的元素均为常数0。

实现举例

对称矩阵
cpp 复制代码
#include<iostream>
using namespace std;

class SymmetricMatrix {
private:
    int n;
    int *matrix;

public:
    SymmetricMatrix(int n) {
        this->n = n;
        matrix = new int[n*(n+1)/2];
    }

    ~SymmetricMatrix() {
        delete [] matrix;
    }

    int get(int i, int j) {
        if (i < j) {
            swap(i, j);
        }
        return matrix[i*(i+1)/2 + j];
    }

    void set(int i, int j, int value) {
        if (i < j) {
            swap(i, j);
        }
        matrix[i*(i+1)/2 + j] = value;
    }

    void print() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << get(i, j) << " ";
            }
            cout << endl;
        }
    }
};

int main() {
    SymmetricMatrix sm(3);
    sm.set(0, 0, 1);
    sm.set(0, 1, 2);
    sm.set(0, 2, 3);
    sm.set(1, 1, 4);
    sm.set(1, 2, 5);
    sm.set(2, 2, 6);
    sm.print();
    return 0;
}
举例说明

这个程序定义了一个SymmetricMatrix类,该类包含一个一维数组用于存储对称矩阵的元素,以及几个用于操作这个矩阵的方法。get方法用于获取矩阵中的元素,set方法用于设置矩阵中的元素,print方法用于打印矩阵的内容。在main函数中,我们创建了一个3x3的对称矩阵,并设置了其元素的值,然后打印了这个矩阵的内容。

对角矩阵
cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

class DiagonalMatrix {
private:
    int n;
    vector<int> diagonal;

public:
    DiagonalMatrix(int n) {
        this->n = n;
        diagonal.resize(n, 0);
    }

    int get(int i, int j) {
        if (i == j) {
            return diagonal[i];
        } else {
            return 0;
        }
    }

    void set(int i, int j, int value) {
        if (i == j) {
            diagonal[i] = value;
        }
    }

    void print() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << get(i, j) << " ";
            }
            cout << endl;
        }
    }
};

int main() {
    int n = 5;  // 矩阵的大小为5x5
    DiagonalMatrix dm(n);  // 创建一个大小为5x5的对角矩阵
    dm.set(0, 0, 1);  // 设置对角线上的元素值为1, 2, 3, 4, 5
    dm.set(1, 1, 2);
    dm.set(2, 2, 3);
    dm.set(3, 3, 4);
    dm.set(4, 4, 5);
    dm.print();  // 打印矩阵的内容
    return 0;
}
举例说明

这个示例中,定义了一个DiagonalMatrix类,该类包含一个一维数组用于存储对角线上的元素,并定义了几个方法,包括获取元素值、设置元素值以及打印矩阵内容。在main函数中,我们创建了一个大小为5x5的对角矩阵,并设置了对角线上的元素值,然后打印了这个矩阵的内容。由于对角矩阵只有对角线上的元素不为0,因此在get方法中,如果传入的行列号不相等,直接返回0即可。在set方法中,只有当传入的行列号相等时,才会将对角线上的元素值进行设置。这个示例中,创建的对角矩阵是一个单位矩阵,即对角线上的元素值都为1。

三角矩阵
cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

class TriangularMatrix {
private:
    int n;
    vector<vector<int>> matrix;

public:
    TriangularMatrix(int n) {
        this->n = n;
        matrix.resize(n, vector<int>(n));
    }

    int get(int i, int j) {
        if (i >= j) {
            return matrix[i][j];
        } else {
            return 0;
        }
    }

    void set(int i, int j, int value) {
        if (i >= j) {
            matrix[i][j] = value;
        }
    }

    void print() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << get(i, j) << " ";
            }
            cout << endl;
        }
    }
};

int main() {
    int n = 5;  // 矩阵的大小为5x5
    TriangularMatrix tm(n);  // 创建一个大小为5x5的下三角矩阵
    // 设置下三角矩阵的元素值,其中对角线及其下方的元素值不为0
    tm.set(0, 0, 1);  // 第一行第一列的元素值为1
    tm.set(1, 0, 2);  // 第二行第一列的元素值为2
    tm.set(1, 1, 3);  // 第二行第二列的元素值为3
    tm.set(2, 0, 4);  // 第三行第一列的元素值为4
    tm.set(2, 1, 5);  // 第三行第二列的元素值为5
    tm.set(2, 2, 6);  // 第三行第三列的元素值为6
    tm.print();  // 打印矩阵的内容
    return 0;
}
举例说明

这个示例中,定义了一个TriangularMatrix类,该类包含一个二维数组用于存储下三角矩阵的元素,并定义了几个方法,包括获取元素值、设置元素值以及打印矩阵内容。在main函数中,我们创建了一个大小为5x5的下三角矩阵,并设置了其中一些元素的值,然后打印了这个矩阵的内容。由于下三角矩阵只有对角线及其下方的元素不为0,因此在get方法中,如果传入的行号小于列号,直接返回0即可。在set方法中,只有当传入的行号大于等于列号时,才会将对应位置的元素值进行设置。这个示例中,创建的下三角矩阵是一个普通的下三角矩阵,你可以根据需要修改这个示例代码来实现你想要的功能。同时,你也可以根据类似的方法实现上三角矩阵。

总结

在数据结构中,矩阵通常用于存储和处理大量数据,例如图像处理、机器学习、线性代数等领域。这些特殊类型的矩阵(对称矩阵、对角矩阵、三角矩阵)在存储和处理时可以利用其特性进行优化,例如对称矩阵可以只存储一半的元素,对角矩阵可以只存储对角线上的元素,从而节省存储空间和提高处理效率。

相关推荐
tainshuai1 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证7 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun7 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao348 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11338 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆9 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路9 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗10 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者12 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy12 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率