C++实现行列式的相关操作

2023-11-16

目录

一.前言

二.行列式运算操作集

1.概览

2.行列式的定义

3.行列式的输出与输入

4.行列式行与行,列与列的相加

5.行列式的行交换与列交换

6.行列式的行提取公因数与列提取公因数

7.行列式系数清零恢复

8.判断一个行列式是否是三角阵

9.求余子式和代数余子式

10.求行列式的值

11.行列式的转置

12.所有代码

三.总结


一.前言

最近在学习C++,数据结构以及线性代数,我突发奇想,为什么不把这几个东西放在一起学习呢?于是我想把一些可以用C++语言描述的线性代数上的操作写出来,这样一来也可以加深我的记忆,写了一些之后果然行列式的性质我都记住了。接下来我将分享我的小成果。

二.行列式运算操作集

1.概览

我将这个操作集命名为了“linear_algebra.h”,也就是线性代数,我用百度直接翻译的。因为我的目标不只局限于行列式,我希望能写出一个包括大部分线性代数操作的库,因此我给它起名为线性代数,但是目前里边只有行列式的操作。

2.行列式的定义

既然是对行列式进行操作那么必须有一个合适的结构来存储行列式,经过认真的学习行列式的构造,我定义了如下结构的行列式:

typedef struct{
    double data[MaxSize][MaxSize];//二维数组,存储行列式用的数据主体
    int dimension;//维度,也就是行列式的阶数
    double multiple;//用于存储行列式的倍数
}det;//行列式的基本定义

首先是一个方形二维数组存放行列式,我命名为了data,dimension是阶数,multiple是系数,我用英文“乘”来表示,因为我当时忘了系数用英语怎么说。我们知道行列式的一个性质就是可以提出一行或一列的公因数放到外边作为整个行列式的系数,我们也可以将行列式的系数乘到里边的一行或一列中去。因此我需要一个变量来存储这个值。

3.行列式的输出与输入

1.行列式的输入

void input_det(det &inc_det){//以引用的方式传入行列式,因为我们需要对行列式进行改变。
    int i, j;
    std::cout << "请输入行列式维度:";
    std::cin >> inc_det.dimension;
    std::cout << "请输入行列式构型:" << std::endl;
    for (i = 0; i < inc_det.dimension; i++){
        for (j = 0; j < inc_det.dimension; j++){
            std::cin >> inc_det.data[i][j];
        }
    }
    inc_det.multiple = 1;
}//此函数用于输入一个行列式

2.行列式的输出

void print_det(det inc_det){//打印一个行列式1,因为仅访问即可,所以不用使用引用类型
    int i, j;
    std::cout << "这个行列式的维度为:" << inc_det.dimension << std::endl;
    std::cout << "其具体构型为:" << std::endl;
    for (i = 0; i < inc_det.dimension; i++){    
        std::cout << "|";
        for (j = 0; j < inc_det.dimension-1; j++){
            std::cout << inc_det.data[i][j] << " ";
        }
        if(i == inc_det.dimension/2)
            std::cout << inc_det.data[i][j] << "|" << "*"<< inc_det.multiple << std::endl;
        else
            std::cout << inc_det.data[i][j] << "|" << std::endl;
    }
}//此函数用于输出一个行列式

4.行列式行与行,列与列的相加

void det_add(det &inc_det, int i, int j, int n, int flag){//此函数用于将行列式的第i行/列的n倍加到第j行/列。i是加行;j是被加行;n是加行的倍数;flag是标志符号,若为0,则代表进行行操作,若为1则代表列操作,其他非法。
    i -= 1;
    j -= 1;
    if(flag==0){//标志为0进行行操作
        for (int t = 0; t < inc_det.dimension;t++){
            inc_det.data[j][t] = inc_det.data[j][t] + n * inc_det.data[i][t];
        }
    }else if(flag==1){
        for (int t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][j] = inc_det.data[t][j] + n * inc_det.data[t][i];
        }
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}//将一个行列式中的第i行的n倍加在其第j行上

就是简单的二维数组的行列操作。

5.行列式的行交换与列交换

void det_change(det &inc_det, int i, int j, int flag){//行/列互换。交换第i行/列与第j行/列的值。flag是标志符号,0代表行操作,1代表列操作,其他非法。
    int t, h;
    i -= 1;
    j -= 1;
    if(flag==0){
        for (t = 0; t < inc_det.dimension; t++){
            h = inc_det.data[j][t];
            inc_det.data[j][t] = inc_det.data[i][t];
            inc_det.data[i][t] = h;
        }
        inc_det.multiple *= -1;//符号变化
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension; t++){
            h = inc_det.data[t][j];
            inc_det.data[t][j] = inc_det.data[t][i];
            inc_det.data[t][i] = h;
        }
        inc_det.multiple *= -1;//符号变化
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}//互换行列式的第i行和第j行

同样是简单的二维数组行列操作,但是注意系数要乘一个“-1”。

6.行列式的行提取公因数与列提取公因数

void det_extract(det &inc_det, int i, int n,int flag){//行/列公因数的提取。flag是标志位,0代表行操作,1代表列操作。
    int t;
    i -= 1;
    if(i<0){
        std::cout << "非法的参数值:i。行/列数最小为1。" << std::endl;
        return;
    }
    if(flag==0){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[i][t] = inc_det.data[i][t]/n;
        }
        inc_det.multiple *= n;
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][i] = inc_det.data[t][i]/n;
        }
        inc_det.multiple *= n;
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}

7.行列式系数清零恢复

void det_recover(det &inc_det, int i,int flag){//将系数乘到第i行/列上
    int t;
    i -= 1;
    if(i<0){
        std::cout << "非法的参数值:i。行/列数最小为1。" << std::endl;
        return;
    }
    if(flag==0){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[i][t] = inc_det.data[i][t]*inc_det.multiple;
        }
        inc_det.multiple = 1;
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][i] = inc_det.data[t][i]*inc_det.multiple;
        }
        inc_det.multiple = 1;
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}

将系数乘入指定的行/列中,系数变为1。

8.判断一个行列式是否是三角阵

bool trangle_det(det &inc_det){//通过逐行检测的方式判断一个行列式是不是三角阵
    int i, j,ji = 0;
    bool down_flag = true;
    bool up_flag = true;
    for (i = 1,j = 1; i < inc_det.dimension;i++,j++){
        for (ji = 0; ji < j;ji++){
            if(inc_det.data[i][ji]!=0){
                down_flag = false;
            }
        }
    }
    for (i = 0, j = 1; i < inc_det.dimension; i++, j++){
        for (ji = j; ji < inc_det.dimension;ji++){
            if(inc_det.data[i][ji]!=0){
                up_flag = false;
            }
        }
    }
    if(up_flag||down_flag){
        return true;
    }else{
        return false;
    }
}//判断某一个行列式是否是三角行列式,包括上三角和下三角

通过暴力扫描法判断一个行列式是否是三角阵,三角阵分为上三角和下三角和对角阵,但是我们只需判断出它为上三角或下三角就能确定其为三角阵了。

9.求余子式和代数余子式

det remainder_form(det inc_det, int i, int j){//求余子式,结果会返回一个新的矩阵类型。
    det m;
    int inc_r, inc_l;
    int m_r = 0, m_l = 0;
    m.dimension = inc_det.dimension - 1;
    m.multiple = inc_det.multiple;
    for (inc_r = 0; inc_r < inc_det.dimension; inc_r++){
        for (inc_l = 0; inc_l < inc_det.dimension; inc_l++){
            if (inc_r != i && inc_l != j){
                m.data[m_r][m_l] = inc_det.data[inc_r][inc_l];
                m_l++;
                if (m_l > m.dimension-1){
                    m_r++;
                    m_l = 0;
                }
            }
        }
    }
    return m;
}

这个函数只能求出余子式的结构。也就是会得到一个新的矩阵。代数余子式经过带入公式就可以得到,具体的行列式求值需要函数的相互配合使用。但是这个函数只负责求出余子式的结构。同时我们注意在求余子式时不能让外边有系数,这是我设计的一个缺陷,如果外边有系数必须先乘进去,否则会导致行列式出现数值错误。

10.求行列式的值

1.递归函数

int solve_normal_det(det inc_det){//求普通和行列式
    double sum = 0;
    if(inc_det.dimension>2){
        for (int i = 0; i < inc_det.dimension; i++){
            sum = sum + pow(-1,i)*inc_det.data[i][0]*solve_normal_det(remainder_form(inc_det,i,0));
        }
        return sum;
    }else{
        return inc_det.data[0][0] * inc_det.data[1][1] - inc_det.data[0][1] * inc_det.data[1][0];
    }
    
}

递归的配合余子式函数算出行列式的值,可以发现这里和书上的定义法是一样的,也就是第一行/列的值乘以他们的代数余子式再相加。这里可以发现代数余子式直接带入公式就可以配合余子式函数计算出来。

2.总函数

double solve_det(det &inc_det){
    det_recover(inc_det, 1, 0);//在求一个矩阵之前我们最好将他恢复成初始阵
    if(trangle_det(inc_det)){
        int result = 1;
        for (int i = 0; i < inc_det.dimension;i++){
            result = result * inc_det.data[i][i];
        }
        return result * inc_det.multiple;;
    }else{
        return solve_normal_det(inc_det);
    }
    
}//用于求解行列式

这个函数有点特殊,它是用于求所有的行列式的,在这个函数里首先会判断一下是否为三角阵,如果是的话就直接对角相乘;不是的话就使用上面的行列式求解函数。因为这里涉及计算以及余子式的划分,所以我在一开头就把系数乘到了行列式里边。

11.行列式的转置

void det_transposition(det &inc_det){//转置就是行列互换
    int t[MaxSize][MaxSize];
    for (int i = 0; i < inc_det.dimension;i++){
        for (int j = 0; j < inc_det.dimension;j++){
            t[i][j] = inc_det.data[i][j];
        }
    }//先复制一份样品。
    for (int i = 0; i < inc_det.dimension;i++){
        for (int j = 0; j < inc_det.dimension;j++){
            inc_det.data[j][i] = t[i][j];
        }
    }
}

暴力的备份转置法。

12.所有代码

#include <iostream>
#include <math.h>
#define MaxSize 100
/*-------------------------------------------维度在100以内的行列式计算----------------------------------------------*/
typedef struct{
    double data[MaxSize][MaxSize];//二维数组,存储行列式用的数据主体
    int dimension;//维度,也就是行列式的阶数
    double multiple;//用于存储行列式的倍数
}det;//行列式的基本定义

void input_det(det &inc_det){//以引用的方式传入行列式,因为我们需要对行列式进行改变。
    int i, j;
    std::cout << "请输入行列式维度:";
    std::cin >> inc_det.dimension;
    std::cout << "请输入行列式构型:" << std::endl;
    for (i = 0; i < inc_det.dimension; i++){
        for (j = 0; j < inc_det.dimension; j++){
            std::cin >> inc_det.data[i][j];
        }
    }
    inc_det.multiple = 1;
}//此函数用于输入一个行列式


void print_det(det inc_det){//打印一个行列式1,因为仅访问即可,所以不用使用引用类型
    int i, j;
    std::cout << "这个行列式的维度为:" << inc_det.dimension << std::endl;
    std::cout << "其具体构型为:" << std::endl;
    for (i = 0; i < inc_det.dimension; i++){    
        std::cout << "|";
        for (j = 0; j < inc_det.dimension-1; j++){
            std::cout << inc_det.data[i][j] << " ";
        }
        if(i == inc_det.dimension/2)
            std::cout << inc_det.data[i][j] << "|" << "*"<< inc_det.multiple << std::endl;
        else
            std::cout << inc_det.data[i][j] << "|" << std::endl;
    }
}//此函数用于输出一个行列式


void det_add(det &inc_det, int i, int j, int n, int flag){//此函数用于将行列式的第i行/列的n倍加到第j行/列。i是加行;j是被加行;n是加行的倍数;flag是标志符号,若为0,则代表进行行操作,若为1则代表列操作,其他非法。
    i -= 1;
    j -= 1;
    if(flag==0){//标志为0进行行操作
        for (int t = 0; t < inc_det.dimension;t++){
            inc_det.data[j][t] = inc_det.data[j][t] + n * inc_det.data[i][t];
        }
    }else if(flag==1){
        for (int t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][j] = inc_det.data[t][j] + n * inc_det.data[t][i];
        }
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}//将一个行列式中的第i行的n倍加在其第j行上


void det_change(det &inc_det, int i, int j, int flag){//行/列互换。交换第i行/列与第j行/列的值。flag是标志符号,0代表行操作,1代表列操作,其他非法。
    int t, h;
    i -= 1;
    j -= 1;
    if(flag==0){
        for (t = 0; t < inc_det.dimension; t++){
            h = inc_det.data[j][t];
            inc_det.data[j][t] = inc_det.data[i][t];
            inc_det.data[i][t] = h;
        }
        inc_det.multiple *= -1;//符号变化
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension; t++){
            h = inc_det.data[t][j];
            inc_det.data[t][j] = inc_det.data[t][i];
            inc_det.data[t][i] = h;
        }
        inc_det.multiple *= -1;//符号变化
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}//互换行列式的第i行和第j行


void det_extract(det &inc_det, int i, int n,int flag){//行/列公因数的提取。flag是标志位,0代表行操作,1代表列操作。
    int t;
    i -= 1;
    if(i<0){
        std::cout << "非法的参数值:i。行/列数最小为1。" << std::endl;
        return;
    }
    if(flag==0){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[i][t] = inc_det.data[i][t]/n;
        }
        inc_det.multiple *= n;
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][i] = inc_det.data[t][i]/n;
        }
        inc_det.multiple *= n;
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

void det_recover(det &inc_det, int i,int flag){//将系数乘到第i行/列上
    int t;
    i -= 1;
    if(i<0){
        std::cout << "非法的参数值:i。行/列数最小为1。" << std::endl;
        return;
    }
    if(flag==0){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[i][t] = inc_det.data[i][t]*inc_det.multiple;
        }
        inc_det.multiple = 1;
    }else if(flag==1){
        for (t = 0; t < inc_det.dimension;t++){
            inc_det.data[t][i] = inc_det.data[t][i]*inc_det.multiple;
        }
        inc_det.multiple = 1;
    }else{
        std::cout << "非法的标志符号:flag。flag只允许为1/0。" << std::endl;
    }
    
}


bool trangle_det(det &inc_det){//通过逐行检测的方式判断一个行列式是不是三角阵
    int i, j,ji = 0;
    bool down_flag = true;
    bool up_flag = true;
    for (i = 1,j = 1; i < inc_det.dimension;i++,j++){
        for (ji = 0; ji < j;ji++){
            if(inc_det.data[i][ji]!=0){
                down_flag = false;
            }
        }
    }
    for (i = 0, j = 1; i < inc_det.dimension; i++, j++){
        for (ji = j; ji < inc_det.dimension;ji++){
            if(inc_det.data[i][ji]!=0){
                up_flag = false;
            }
        }
    }
    if(up_flag||down_flag){
        return true;
    }else{
        return false;
    }
}//判断某一个行列式是否是三角行列式,包括上三角和下三角

det remainder_form(det inc_det, int i, int j){//求余子式,结果会返回一个新的矩阵类型。我认为在求余子式之前我们应该先把矩阵系数清空
    det m;
    int inc_r, inc_l;
    int m_r = 0, m_l = 0;
    m.dimension = inc_det.dimension - 1;
    m.multiple = inc_det.multiple;
    for (inc_r = 0; inc_r < inc_det.dimension; inc_r++){
        for (inc_l = 0; inc_l < inc_det.dimension; inc_l++){
            if (inc_r != i && inc_l != j){
                m.data[m_r][m_l] = inc_det.data[inc_r][inc_l];
                m_l++;
                if (m_l > m.dimension-1){
                    m_r++;
                    m_l = 0;
                }
            }
        }
    }
    return m;
}

int solve_normal_det(det inc_det){//求普通和行列式
    double sum = 0;
    if(inc_det.dimension>2){
        for (int i = 0; i < inc_det.dimension; i++){
            sum = sum + pow(-1,i)*inc_det.data[i][0]*solve_normal_det(remainder_form(inc_det,i,0));
        }
        return sum;
    }else{
        return inc_det.data[0][0] * inc_det.data[1][1] - inc_det.data[0][1] * inc_det.data[1][0];
    }
    
}


double solve_det(det &inc_det){
    det_recover(inc_det, 1, 0);//在求一个矩阵之前我们最好将他恢复成初始阵
    if(trangle_det(inc_det)){
        int result = 1;
        for (int i = 0; i < inc_det.dimension;i++){
            result = result * inc_det.data[i][i];
        }
        return result * inc_det.multiple;;
    }else{
        return solve_normal_det(inc_det);
    }
    
}//用于求解行列式

void det_transposition(det &inc_det){//转置就是行列互换
    int t[MaxSize][MaxSize];
    for (int i = 0; i < inc_det.dimension;i++){
        for (int j = 0; j < inc_det.dimension;j++){
            t[i][j] = inc_det.data[i][j];
        }
    }//先复制一份样品。
    for (int i = 0; i < inc_det.dimension;i++){
        for (int j = 0; j < inc_det.dimension;j++){
            inc_det.data[j][i] = t[i][j];
        }
    }
}

三.总结

我主要是为了复习线性代数写了这个操作集。通过写这个操作集我比较深入的复习了行列式的性质,对于行列式的计算以及行和列运算的共同点有了深入的了解。同时还对行列式的运算有了更深的认识。接下来复习全本书应该会舒服点吧?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现行列式的相关操作 的相关文章

  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 线程安全的get(访问器方法)

    我目前正在使用以下代码对变量进行线程安全访问 int gnVariable void getVariableValue int pnValue acquireLock Acquires the protection mechanism pn
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He

随机推荐

  • Python同时显示多张图片在一个画面中(两种方法)

    很多时候需要把很多图片同时显示到一个画面中 现在分享两个方法 这里我恰好拿之前写的爬取网上图片保存到本地的爬虫模型爬一些图片作为素材Python 爬虫批量爬取网页图片保存到本地 得到素材如下所示 现在让这些图片同时显示 方法一 subplo
  • [论文笔记]知识图谱+推荐系统

    仅作个人笔记 2021 3 22 2021 3 29 1 RippleNet Propagating User Preferences on the Knowledge Graph for Recommender Systems 看到一篇翻
  • 深入理解程序设计使用Linux汇编语言

    关于函数 4 1 由系统提供的函数称为原函数 或源语 因为其他一切都是建立在它们之上 在汇编语言中 原语通常就是系统调用 4 3 由于内存的结构 栈是从内存顶部开始向下增长的 当我们提到 栈顶 请记住这是栈内存的底部 movl esp ea
  • C语言 - 制作一个可以容纳一千人的本地通讯录

    本章目录 前言 一 菜单制作 二 创建通讯录 1 创建人员信息结构体 2 创建完整通讯录结构体 3 初始化通讯录 4 存放数据 5 判断空间容量 三 各功能的实现 1 增加人员信息的功能 2 按名字查找的功能 内部使用 3 删除人员信息的功
  • 手把手教你CIFAR数据集可视化

    CIFAR数据集介绍与获取 如同从小到的父母教我们识别每个物体是什么一样 除了看到的画面 父母会在旁边告诉看到的画面是什么 这种学习方式叫做监督学习 与此对应还有无监督学习 计算机也一样 数据集通常应该至少包含两部分内容 一个是图像 一个是
  • C语言:三目运算符 “?”号

    三目运算符的表示一般为 该运算符连接3个对象 是C语言中唯一一个三目运算符 又称条件运算符 它的一般形式如下 表达式a 表达式b 表达式c 其执行步骤如下 1 计算表达式a的值 2 如果表达式a的值为1 则执行表达式b 3 如果表达式b的值
  • 支付宝API支付使用文档--java《扫一扫支付》--demo但是封装高可用--改一改配置就拿走用!超详细!!有手就行!!!--spring +vue-调用支付宝的当面付的预创建接口

    支付宝API支付使用文档 java 扫一扫支付 demo但是封装高可用 改一改配置就拿走用 超详细 有手就行 上 修改官网配置类 一单成的博客 CSDN博客 阿丹 上一篇文章具体的描述和讲解了官方提供的配置类 以及如何使用注册开发沙箱 本篇
  • Linux系统图形界面,字符界面切换快捷键。启动图形界面服务。

    Ctrl Alt F3 启动字符界面 Ctrl Alt F7 启动图形界面 启动图形界面服务 cd etc init d service lightdm restart
  • 重装win8.1搜索不到 wifi

    这几天一直忙着研究装系统 毕竟自己是个小白 经常搞到深夜4点钟 今天终于算是有点眉目了 重新装完win8 1 电脑竟然搜索不到wifi 点开右下角那个图标 只有宽带连接这一个选项 于是到网上搜索 怎么解决 网上给了很多答案 基本都差不多 我
  • TCP/IP的三次握手、四次挥手

    本文通过图来梳理TCP IP协议相关知识 TCP通信过程包括三个步骤 建立TCP连接通道 传输数据 断开TCP连接通道 如图1所示 给出了TCP通信过程的示意图 上图主要包括三部分 建立连接 传输数据 断开连接 建立TCP连接很简单 通过三
  • Temporary failure in name resolution解决方法

    终端运行sudo su 输密码 vi etc reslov conf 输入i进入编辑模式 在文档末尾加入 nameserver 8 8 8 8 nameserver 114 114 114 114 按esc 输入 wq保存退出 执行 etc
  • 第八章 Oracle恢复内部原理(重置日志RESETLOGS)

    重置日志选项用于下列情形后的第一次打开数据库的时候 不完全恢复 基于备份控制文件的恢复 CREATE CONTROLFILE RESETLOGS 重置日志的最主要的作用就是丢弃不完全恢复中没有使用的重做日志并保证后续的恢复不再需要 为此 重
  • dll修复工具哪个比较好?修复工具介绍

    DLL 动态链接库 是Windows操作系统中非常重要的一部分 它们存储了各种软件应用程序所需的公共代码和数据 然而 随着时间的推移 电脑上的DLL文件可能会因为各种原因而损坏或丢失 导致系统出现错误 因此 修复DLL错误是一项非常重要的任
  • linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互

    西门子plc 有snap7库 进行交互 并且支持c 而且跨平台 但是三菱系列PLC并没有现成的开源项目 没办法只能自己拼接 我这里实现了MC 协议 Qna3E 帧 并使用二进制进行交互 pragma once include
  • HDU--1236:排名 (水题)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1236 2 程序源代码 HOJ 1236 排名 include
  • 软件测试框架理论知识

    一 软件测试的定义 1 软件测试的目标应该服从于软件项目的目标 软件测试通过更高效的方法和工具 提高软件开发的效率和质量 2 在规定的条件下 对软件进行审核 运行 评估 验证软件系统是否满足需求规格说明书 3 预防 发现 跟踪软件缺陷 提高
  • Unity篇:加快unity导入工程速度-Cache server链接

    1 已有unity打开 编辑窗口选择点击edit edit下拉展示的列表里打开Preferences 2 选择Cache server界面 Cache server Mode 选择remote 举例 输入192 168 15 131或者19
  • 目标检测中的mAP(mean Average Precision)快速理解

    前言 最近开始接触目标检测 object detection 但是对于衡量算法好坏的mAP Mean Average Precision 并不太理解 经过了一番整理 下面我们就来看看什么是mAP 在目标检测算法中 像是Faster R CN
  • vue上下滑动(仿高德)

    效果图 需求 一个页面底部对应一块区域 底部的区域可以上下滑动到顶部 可以来回上下滑动延伸 如上所述 代码
  • C++实现行列式的相关操作

    目录 一 前言 二 行列式运算操作集 1 概览 2 行列式的定义 3 行列式的输出与输入 4 行列式行与行 列与列的相加 5 行列式的行交换与列交换 6 行列式的行提取公因数与列提取公因数 7 行列式系数清零恢复 8 判断一个行列式是否是三