-
2019-12-09 13:04:52
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
输入矩阵的行数,再依次输入矩阵的每行元素,判断该矩阵是否为对称矩阵,若矩阵对称输出“yes",不对称输出”no“。
Input
输入有多组,每一组第一行输入一个正整数N(N<=20),表示矩阵的行数(若N=0,表示输入结束)。
下面依次输入N行数据。Output
若矩阵对称输出“yes",不对称输出”no”。
Sample Input
3
6 3 12
3 18 8
12 8 7
3
6 9 12
3 5 8
12 6 3
0Sample Output
yes
noHint
Source#include <stdio.h> #include <stdlib.h> int main() { int n; int i,j; int a[21][21]; while(~scanf("%d",&n)&&n) //多组输入若为EOF或者n==0都将结束输入 { int flag=1; //定义标记变量; for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); //输入数据; } } for(i=0;i<n;i++) { for(j=0;j<i;j++) { if(a[i][j]!=a[j][i]) //若出现一组不对称的数据则标记变量flag=0且结束循环; { flag=0; break; } } if(j<i) break; //若上一个for循环为非正常结束,则外层循环也结束 } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }
运行结果: 3 6 3 12 3 18 8 12 8 7 yes 3 6 9 12 3 5 8 12 6 3 no 0 Process returned 0 (0x0) execution time : 27.657 s Press any key to continue.
更多相关内容 -
k重循环矩阵非异性的一个判定 (1997年)
2021-06-16 08:52:24用数学归纳法证明了n1n2…nk阶(n1,n2,…,nk)型k重循环矩阵可以酉对角化,并给出了一种仅用其第一行的元素就可以判断其非异性的简便方法。 -
H-循环矩阵的一些性质 (2009年)
2021-05-21 18:23:25根据循环矩阵和H-矩阵的定义,给出了H-循环矩阵的定义,并根据其特殊结构,借助于置换矩阵等工具,得到了H-循环矩阵的一些性质和判定定理。 -
回路双三角逆M矩阵完备的判定定理 (2010年)
2021-05-09 09:35:14循环双三角是一个有向图,它包含两个3结构周期。研究了逆M矩阵的图在该有向图中的完备问题。对每个周期所包含的所有指定的顶点以及所包含的未指定的顶点都进行了探讨;同时给出了完备定律和运算方法。 -
2021-08-06 矩阵相等判定
2021-08-06 23:34:15BC105 矩阵相等判定 思路: 分为四步。根据题意我们知道两个矩阵的行和列都是一样的,所以第一步定义所需的变量,分别是两个二维数组(因为n和m最大值为10,所以二维数组的行和列都为10),输入的行和列数,以及...
牛客网
编程初学者入门训练
BC105 矩阵相等判定
思路:
分为四步。根据题意我们知道两个矩阵的行和列都是一样的,所以第一步定义所需的变量,分别是两个二维数组(因为n和m最大值为10,所以二维数组的行和列都为10),输入的行和列数,以及循环要用的两个变量,和标记变量(初值我赋为1);第二步为实现输入第一个二维数组的变量,两个循环的条件分别是小于行和列;第三步为实现输入第二个二维数组的变量,两个循环的条件分别也是小于行和列,但是我们要随便判断下是否跟第一个二维数组一样,如果在输入并判断的过程中出现不同,则将标记变量改为0;第四步就是根据上面的标记变量作出判断输出,引用if,else语句,如果标记变量还是1就输出Yes,不然就是No。
代码实现如下:
备注:上述题目来源于牛客网,网址是https://www.nowcoder.com/ta/beginner-programmers,本人才疏学浅,如有问题,欢迎各位大佬们指证改出。感谢各位老铁们的支持!
-
C语言每日练习题——No.24,上三角矩阵的判定
2022-03-04 16:56:33上三角矩阵判定_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/f5a29bacfc514e5a935723857e1245e4?tpId=107&difficulty=&judgeStatus=&tags=&title=106&gioEnter=menu ...题目链接:
上三角矩阵判定_牛客题霸_牛客网 (nowcoder.com)
https://www.nowcoder.com/practice/f5a29bacfc514e5a935723857e1245e4?tpId=107&difficulty=&judgeStatus=&tags=&title=106&gioEnter=menu
解题思路:
1.要用到嵌套 for 循环
2. 内层循环的判断条件是外层循环的层数
3. 注意外层循环的初始值
答案代码:
#include <stdio.h> int main () { int data = 0; scanf("%d\n",&data); int arr[10][10] = {0}; int i = 0; for (i = 0;i < data;i++) { int j = 0; for (j = 0;j < data;j++) { scanf("%d ",&arr[i][j]); } } //数据输入 int m = 0; int change = 0; for (m = 1;m < data;m++) //注意m的初始值 { int n = 0; for (n = 0;n < m;n++) { if (arr[m][n] != 0) { printf("NO"); return 0; } else change = 1; } } if (change == 1) //这一段代码必须在外层循环的外面 printf("YES"); return 0; }
-
线性代数代码实现(四)行列式与可逆矩阵的判定(c++)
2021-10-19 13:14:55上一篇文章中,我们探讨了矩阵的秩与可逆矩阵的判定方法,我提到将说出下一种判断矩阵是否可逆的方法,这篇文章就跟大家探讨一下。 一、线性代数知识回顾: 1. 排列:由1,2,···,n 这n个数组成的有序的数组就是...前言:
上一篇文章中,我们探讨了矩阵的秩与可逆矩阵的判定方法,我提到将说出下一种判断矩阵是否可逆的方法,这篇文章就跟大家探讨一下。
一、线性代数知识回顾:
1. 排列:由1,2,···,n 这n个数组成的有序的数组就是一个 n 阶排列
2. 逆序数:在一个排列中,如果有两个数 a 和 b,若满足 a 在 b 的前面,且 a 大于 b ,那么它称为一个逆序,一个排列的所有逆序的个数称为逆序数。
记
为一个 n 阶排列,记
为该排列的逆序数
3. 行列式:对于一个 n 阶方阵
,记
或
为
的行列式,它的定义如下:
等于所有取自不同行不同列的 n 个元素的乘积
的代数和,记
是 1,2,···,n 的一个排列,行列式的定义可写为:
有了定义后,我们固然是可以写出代码计算行列式的,我们可以看到行列式的计算需要找到所有的取自不同行不同列的元素乘积,如果需要代码实现,那么我们需要找到 n 阶排列的所有情况(n 阶全排列),而 n 阶全排列总共有 n ! 个,当矩阵比较大时,我们的程序就需要执行很多次,相当耗费时间。因此,我们不这样求解行列式。我们给出另外一种方法求解行列式,这需要以下线性代数知识:
4. 定理:
交换行列式两行,行列式反号
把一行的倍数加到另一行,行列式不变
5. 上三角行列式:主对角线以下元素为 0 的行列式,上三角行列式的值等于主对角线元素的成绩。设
为上三角行列式,则:
也就是说,将行列式通过上面第 4 条定理所说的两条化为上三角行列式,记录交换行列式两行的次数,然后通过第 5 条就可以求解出行列式的值了,这样做可以处理较大阶的行列式!下面再给出一个定理说明可逆与行列式的关系:
6. 定理:
矩阵可逆的充要条件是它的行列式不等于零
有了这个定理,我们就可以给出第二个判断矩阵是否可逆的方法了!
二、算法设计:
1. 求解行列式:(与我写的第二篇文章将矩阵化为上三角矩阵十分相似,没看过第二篇文章的伙伴们可以点击这个链接:
线性代数代码实现(二)上三角矩阵(C++)_AI研究者的博客-CSDN博客)
在将矩阵化为上三角矩阵的算法中增加三条:
1)令 result = 1,每次交换不同的两行时,执行 result = -result
2)在外层循环最后执行 result*=mat[i][i],计算上三角矩阵主对角线元素的乘积,并判断result是否为零,若果为零,则说明行列式为零,则退出循环,若不为零,则继续循环
3)循环结束后,执行 result*=mat[m][n] ,乘上主对角线最后一个元素(这里 m = n),返回result
2. 判断矩阵是否可逆:
如果矩阵不是方阵,则不可逆,否则计算出行列式的值, 如果不为零,则矩阵可逆(非奇异),否则,矩阵不可逆(奇异)
三、代码实现:
类的定义:
class Mat { public: int m = 1, n = 1; //行数和列数 double mat[N][N] = { 0 }; //矩阵开始的元素 Mat() {} Mat(int mm, int nn) { m = mm; n = nn; } void create();//创建矩阵 void copy(Mat& a);//复制 double det();//计算行列式 bool judgeinv();//判断矩阵是否可逆 };
det()函数求解矩阵的行列式:
double Mat::det() { if (m != n) { cout << "不是方阵,无行列式" << endl; exit(1); } Mat a; copy(a); double result = 1; for (int i = 1; i < m; i++) { //寻找第 i 列不为零的元素 int k; for (k = i; k <= m; k++) { if (fabs(mat[k][i]) > 1e-10) //满足这个条件时,认为这个元素不为0 break; } if (k <= m)//说明第 i 列有不为0的元素 { if (k != i)//说明需要交换不同的两行 { //交换第 i 行和第 k 行所有元素 for (int j = i; j <= n; j++)//从第 i 个元素交换即可,因为前面的元素都为0 {//使用mat[0][j]作为中间变量交换元素 mat[0][j] = mat[i][j]; mat[i][j] = mat[k][j]; mat[k][j] = mat[0][j]; } result = -result; } double a;//倍数 for (int j = i + 1; j <= m; j++) { a = -mat[j][i] / mat[i][i]; for (k = i; k <= n; k++) { mat[j][k] += a * mat[i][k];//第 i 行 a 倍加到第 j 行 } } } result *= mat[i][i]; if (fabs(result) < 1e-10) //如果为零,则已经可以说明行列式为零了,没必要继续算下去了 break; } result *= mat[m][n]; return result; }
judgeinv()函数判断矩阵是否可逆:
bool Mat::judgeinv() { if (m != n)//不是方阵,不可逆 return false; if (fabs(det()) > 1e-10)//行列式不等于 0 return true; else return false; }
有兴趣的同学也可以自己利用定义做一做求解行列式的函数,主要难点在于如何知道全排列,有兴趣的同学可以想一想。计算行列式当然也有其他方法,这篇文章中介绍的方法算是比较好的方法,大家也可以研究其他方法,同样,判断矩阵是否可逆也有其他方法,大家也同样可以研究研究。包括线性代数的知识,大家都可以仔细思考,实际上线性代数的很多知识都有很好的几何意义,例如我们讲过的矩阵乘法,行列式计算等都是有十分好的几何意义,大家可以去理解理解。(悄悄告诉大家:n 阶矩阵的行列式的绝对值实际上就是 n 维空间中平行多面体的体积)这里附上完整代码:
#include<iostream> #include <cmath> #define N 10 using namespace std; class Mat { public: int m = 1, n = 1; //行数和列数 double mat[N][N] = { 0 }; //矩阵开始的元素 Mat() {} Mat(int mm, int nn) { m = mm; n = nn; } void create();//创建矩阵 void copy(Mat& a);//复制 double det();//计算行列式 bool judgeinv();//判断矩阵是否可逆 }; void Mat::create() { for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { cin >> mat[i][j]; } } } void Mat::copy(Mat& a)//复制函数 { a.m = m; a.n = n; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { a.mat[i][j] = mat[i][j]; } } } double Mat::det() { if (m != n) { cout << "不是方阵,无行列式" << endl; exit(1); } Mat a; copy(a); double result = 1; for (int i = 1; i < m; i++) { //寻找第 i 列不为零的元素 int k; for (k = i; k <= m; k++) { if (fabs(mat[k][i]) > 1e-10) //满足这个条件时,认为这个元素不为0 break; } if (k <= m)//说明第 i 列有不为0的元素 { if (k != i)//说明需要交换不同的两行 { //交换第 i 行和第 k 行所有元素 for (int j = i; j <= n; j++)//从第 i 个元素交换即可,因为前面的元素都为0 {//使用mat[0][j]作为中间变量交换元素 mat[0][j] = mat[i][j]; mat[i][j] = mat[k][j]; mat[k][j] = mat[0][j]; } result = -result; } double a;//倍数 for (int j = i + 1; j <= m; j++) { a = -mat[j][i] / mat[i][i]; for (k = i; k <= n; k++) { mat[j][k] += a * mat[i][k];//第 i 行 a 倍加到第 j 行 } } } result *= mat[i][i]; if (fabs(result) < 1e-10) //如果为零,则已经可以说明行列式为零了,没必要继续算下去了 break; } result *= mat[m][n]; return result; } bool Mat::judgeinv() { if (m != n)//不是方阵,不可逆 return false; if (fabs(det()) > 1e-10)//行列式不等于 0 return true; else return false; } int main() { Mat a(3, 3); cout << "请输入 " << a.m << "*" << a.n << " 的矩阵:" << endl; a.create(); cout << "矩阵的行列式为: " << a.det() << endl; if (a.judgeinv()) cout << "可逆!" << endl; else cout << "不可逆!" << endl; return 0; }
若有不足之处,欢迎大家指正!
-
【数据结构与算法】顺时针 循环打印 矩阵
2019-03-14 15:49:48顺时针循环打印一个矩阵元素。 https://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/ 难点:如何控制下一步该往哪里走? 思路 想法一:如何控制下一步?下一步是由当前方向决定的。所以最直观的... -
判定是否为对称矩阵的题
2021-09-14 23:19:44如果要判断是否为上下左右对称矩阵是n×n矩阵 他的判定条件是a[i][j]==a i ,n-j-1= =a n-1-i , j嘛 用for循环判断 -
r-置换因子循环线性系统求解的快速算法 (2010年)
2021-06-05 11:56:23在置换因子循环矩阵的基础上给出了r-置换因子循环矩阵的概念,得到以这类矩阵为系数的线性方程组AX=b有解的判定条件和快速算法。当r-置换因子循环矩阵非奇异时,该快速算法求出线性方程组的唯一解,即存在唯一的r-... -
稀疏矩阵(C++)
2021-07-19 20:19:04参考:数据结构(c++版)(第二版)清华大学出版社 陈宝平等主编 核心: 1.用一个三元组保存不为0的部分(本质是定义一...3相加,相减,相乘都是把他扩展成二维数组,对应到代码就是两层循环 在循环中判断该行列坐标下 -
Python:利用邻接矩阵判断有向图的连通性
2021-05-19 22:59:13将任意一个有向图G采用矩阵输入,图形化输出图G,利用可达矩阵判定图G是否连通: (PS:判断图的连通性至少可以有[1].并查集 [2].DFS [3].BFS 三种方法,关于其他求解方法,详见:... -
怎么编写一个函数判定n的维数组a是否为对称矩阵?
2021-05-25 07:06:56#include #define n 3 /* 此处假设为3阶矩阵*/int is_duichenjuzhen (int N,int *p[n][n]) /*定义函数*/{int i,j;int flag=1; /*定义标志位*/for(i=0;ifor(j=0;jif(p[i][j]!=p[j][i])flag=0;return flag;}main(){int... -
Python如何优雅的求解10*10矩阵任意两点距离,不使用函数
2021-12-21 20:34:53# 例题:如何求解距离矩阵 demo_arr = np.empty((10, 10)) for i in range(10): demo_arr[i] = np.arange(i, i + 10) print(demo_arr[:10, :10]) a = ['一', '二'] b = ['横', '纵'] ls = [] for i in a: for j in... -
矩阵回型遍历
2021-03-14 20:55:56矩阵回型遍历矩阵回型遍历0. 如何操作矩阵(二维数组)1. 题目分析1.1 画图1.2 遍历的方式1.3 如何限定遍历的顺序?或者是遍历的方向?1.4 如何确定结束条件?2. 实现代码3. 总结 矩阵回型遍历 0. 如何操作矩阵(二... -
2.C语言矩阵乘法
2022-06-01 11:04:28具体讲解了矩阵乘法的原理,以及在C语言中如何创建矩阵乘法的函数 -
【矩阵论】矩阵的相似标准型(3)
2020-10-30 15:11:21从矩阵对角化引入探讨线性变换的对角化问题。(定义、等价命题和定理) -
[转载]matlab错误 关于奇异矩阵
2021-04-18 03:50:54Warning: Matrix is close to singular or badly scaled.Results may be inaccurate....必须换成不用求逆的算法Matrix is close to singular or badly scaled矩阵接近奇异了,可能导致后面不收敛,可不可以把这... -
基于MATLAB的(15,7)循环码的编译仿真.doc
2021-04-23 14:59:32基于MATLAB的(15,7)循环码的编译仿真《纠错码与差错控制》课程设计题目:基于MATLAB的(15,7)循环码的编译仿真院(系) 信息科学与工程学院专 业 通信工程专业届 别 2011级班 级 11通信B学 号 1115106029姓 名 刘珩指导... -
51单片机入门——矩阵按键
2022-02-17 19:01:52常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接。 4 条输入线接到单片机的 IO 口上,当按键 K1 按下时,+5V 通过电阻 R1 然后再通过按键 K1 最终进入 GND ... -
C语言实现一个简单的矩阵运算器
2021-07-19 23:39:29源代码: 正文开始@Assassin 目录:源代码:运行结果:see you next blog~~ #include <stdio.h> #include <windows.h> #include <math.h>... //退出/循环判定 void Add(void); -
C++实现矩阵原地转置算法
2021-05-24 01:10:00本文实例描述了C++实现矩阵原地转置算法,是一个非常经典的算法,相信对于学习C++算法的朋友有很大的帮助。具体如下:一、问题描述微软面试题:将一个MxN的矩阵存储在一个一维数组中,编程实现矩阵的转置。要求:... -
单片机独立按键与矩阵按键原理图
2021-05-20 05:10:15正文单片机独立按键与矩阵按键原理图时间:2017-02-22 12:40 来源:电工之家单片机独立按键与矩阵按键原理图独立按键通常的按键分为独立式按键和矩阵式按键两种,独立式按键比较简单,并且与独立的输入线相连接,如图... -
C++实现行最简型矩阵
2020-02-21 14:06:38昨天学习了线性代数的行最简矩阵的计算方法,思路比较简单,但是做起来比较的麻烦,因此,我查阅了一些资料,编写了一个用C++实现的代码;代码本人已经写好了详细的注释,并且在VS2015编译运行成功,大家可以放心... -
布尔矩阵分解 代码实现(BMF)--MEBF论文阅读
2020-10-16 11:18:10关于布尔矩阵分解,实际就是对于一个布尔矩阵Am∗nA_{m*n}Am∗n(其中元素非0即1)来分解成Bm∗kB_{m*k}Bm∗k与Ck∗nC_{k*n}Ck∗n,其中B与C也同样是布尔矩阵(其中元素非0即1),也就是将一个大型的布尔矩阵... -
局部最优、梯度消失、鞍点、海森矩阵(Hessian Matric)、批梯度下降算法(btach批梯度下降法BGD、小批量梯度...
2020-03-14 21:25:00利用黑塞矩阵可判定多元函数的极值问题。 一个多元函数的二阶偏导数构成的方阵 3.1.1.4 梯度消失 为什么会造成我们的损失函数难优化,其实有个原因就是因为激活函数存在使得函数计算梯度时候遇到梯度消失问题。在... -
矩阵权重计算(tkinter)
2019-12-31 14:15:19直接效果展示 # -*- coding: utf-8 -*- """ Created on Wed Nov 6 08:56:57 2019 @author: 01 """ import statsmodels import tkinter.messagebox #import webbrowser import numpy as np ... -
矩阵中幸运数字
2022-02-15 20:49:34continue 的用法十分简单,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。 代码 int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* ... -
[Matlab学习笔记]Matlab中删除矩阵指定行(指定列)
2021-04-06 09:57:14在用matlab编程进行GNSS粗差提取时,想实现对某矩阵删除指定行(指定列)的命令,下文中描述的均为行。通过百度,先明白对于一行数据而言,删除指定位置的元素的原理。主要思路是先提取要删除的位置,再对该位置数据... -
MATLAB入门教程(3)判断与循环
2020-07-04 21:24:39当然了,MATLAB是矩阵实验室,当然可以在矩阵上用循环了; v=[5 7 9 10 13 3 2 1]; s=0; for i=v s=s+i; end disp(s); %disp(sum(v)); 在上面代码中用for循环对该行向量元素逐个访问累加并输出结果,最后一行使用...