-
2020-12-17 11:26:31
题目
要求将一个矩阵转置
由用户输入行列思路:
如果有用户输入行列的话,我们不知道用户输入了一个几维的数组,所以这样要回归到数组的本来定义是申请一块连续的存储空间,比如一个二维数组存储情况的一维表现就是a11,a12,a21,a22。所以利用这个特性,来解决这个问题。#include<iostream> using namespace std; void convert(int *array,int n) { int i,j,k; for(i=0;i<n;i++) { for(j=0;j<i;j++) { k=*(array+i*n+j); *(array+i*n+j)=*(array+i+j*n); *(array+i+j*n)=k; } } } int main() { int i,j,n; int *p; cout<<"input n"<<endl; cin>>n; p=new int[n*n]; cout<<"input element"<<endl; for(i=0;i<n;i++) { for(j=0;j<n;j++) { cin>>p[i*n+j]; } } cout<<"before: "<<endl; for(i=0;i<n;i++) { for(j=0;j<n;j++) { cout<<p[i*n+j]<<" "; } cout<<endl; } cout<<"afetr: "<<endl; convert(p,n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { cout<<p[i*n+j]<<" "; } cout<<endl; } }
结果
input n 2 input element 1 2 3 4 before: 1 2 3 4 afetr: 1 3 2 4
更多相关内容 -
C++随机数产生以及通过Eigen库获得正态分布的随机矩阵
2018-10-26 14:36:42在C++11标准之前,一般是利用rand()函数产生一个均匀分布的,范围从0到系统相关的最大值之间的随机整数,然后再通过转换得到不同分布的随机数,这种方法比较麻烦,同时转换过程中会引入非随机性。 C++11标准中,...简介
在C++11标准之前,一般是利用rand()函数产生一个均匀分布的,范围从0到系统相关的最大值之间的随机整数,然后再通过转换得到不同分布的随机数,这种方法比较麻烦,同时转换过程中会引入非随机性。
C++11标准中,定义了随机数引擎类和随机数分布类,通过随机数引擎和随机数分布的组合,可以产生各种分布的随机数。这些类包含在头文件random中,使用前需要先包含random头文件:
#include<random>
随机数产生
随机数引擎和随机数分布都是重载了调用运算符"()"的函数对象类,随机数引擎的调用运算符不接受参数,并且返回一个unsigned随机数,称为原始随机数。而随机数分布的调用运算符接受一个随机数引擎类作为参数,返回服从特定分布的随机数。
1 随机数引擎
一般采用default_random_engine类创建一个随机数引擎对象(default_random_engine的具体实现与不同的编译器有关)。创建随机数引擎的方式如下
default_random_engine e;
2 随机数分布
随机数服从的分布由随机数分布类决定,如分布类型 随机数分布类 正态分布 normal_distribution<RealT> n(m,s)
均值为m,标准差为s,m默认值为0,s默认值为1χ 2 \chi^2 χ2分布 chi_squared_distribution<RealT> c(x)
x为自由度,默认为1.0T分布 student_t_distribution<RealT> s(n)
n为自由度,默认为13 利用随机数分布和引擎产生随机数
以正态分布为例,下面的例子产生一个服从 N ( 0 , 1 0 2 ) N(0,10^2) N(0,102)(即均值0,标准差10的正态分布)的随机数。#include<iostream> #include<random> #include<ctime> using namespace std; int main(){ //产生随机数引擎,采用time作为种子,以确保每次运行程序都会得到不同的结果 static default_random_engine e(time(0)); //产生正态分布对象 static normal_distribution<double> n(0,10); double random_number=n(e);//把引擎作为参数,调用随机分布对象 cout<<random_number<<endl; return 0 }
最好把引擎和分布都定义为static。
使用Eigen库和C++随机数机制,产生正态分布的随机矩阵
Eigen中只有产生均匀分布随机矩阵的Random(),没有其他分布类型的随机矩阵函数。
借助Eigen提供的unaryExpr函数,可以对矩阵的每一个元素进行同一个操作。unaryExpr接受一个函数对象作为参数,该函数对象定义了所要对元素进行的运算。因此,我们只需要定一个产生随机数的函数对象,将其作为参数传给unaryExpr,即可对矩阵每一个元素产生随机数。可以用lambda表达式作为函数对象,也可以定义一个函数,并用ptr_fun()函数将函数指针转成函数对象。下面给出这两种方式的实现。
1 采用lambda表达式
#include<iostream> #include<random> #include<Eigen/Eigen> #include<ctime> using namespace std; using namespace Eigen; int main(){ static default_random_engine e(time(0)); static normal_distribution<double> n(0,10); MatrixXd m=MatrixXd::Zero(10,10).unaryExpr([](double dummy){return n(e);}); cout<<"Gaussian random matrix:\n"<<m<<endl; cout<<"Mean: "<<m.mean()<<endl; MatrixXd m2=(m.array()-m.mean())*(m.array()-m.mean()); cout<<"std: "<<sqrt(m2.sum()/(m2.size()-1))<<endl; }
2 采用ptr_fun将函数指针转成函数对象
#include<iostream> #include<random> #include<Eigen/Eigen> #include<ctime> using namespace std; using namespace Eigen; double generate_random(double dummy){ static default_random_engine e(time(0)); static normal_distribution<double> n(0,10); return n(e); } int main(){ MatrixXd m=MatrixXd::Zero(10,10).unaryExpr(ptr_fun(generate_random)); cout<<"Gaussian random matrix:\n"<<m<<endl; cout<<"Mean: "<<m.mean()<<endl; MatrixXd m2=(m.array()-m.mean())*(m.array()-m.mean()); cout<<"std: "<<sqrt(m2.sum()/(m2.size()-1))<<endl; }
3 采用原始的二重for循环
当然也可以遍历矩阵的每一个元素,并用随机数给每个元素赋值,这种做法简单暴力 -
C++ 生成任意矩阵并进行乘法运算
2022-05-23 11:34:58c++ 生成矩阵,矩阵乘法运算实现了矩阵的生成、乘法运算。
1.完整代码如下:
#include <iostream> #include <cstring> #include <chrono> #include <vector> using namespace std; struct Matrix { vector<vector<int>> M; size_t Rows; size_t Columns; Matrix(size_t r = 0,size_t c=0,int rv = 1) { Rows = r; Columns = c; for (size_t i = 0; i < r; i++) { vector<int> t; for (size_t j = 0; j < c; j++) { if (rv > 1) { t.push_back(rand() % rv); } t.push_back(rv); } M.push_back(t); } } bool isNull() { return Rows == 0 || Columns == 0; } void printMatrix(const char* msg = "") { if (strlen(msg)>0) { printf("%s\n", msg); } for (size_t i = 0; i < Rows; i++) { for (size_t j = 0; j < Columns; j++) printf("%d,",M[i][j]); printf("\n"); } } }; // A*B Matrix mulMatrix(Matrix a, Matrix b) { if (a.isNull() || b.isNull()) { printf("空矩阵\n"); // 此处直接返回一个空的Matrix,也就是0行0列的矩阵 return Matrix(); } if (a.Columns != b.Rows) { printf("不符合乘法要求的矩阵"); // 此处直接返回一个空的Matrix,也就是0行0列的矩阵 return Matrix(); } //如果符合要求,构建一个结果矩阵 Matrix c(a.Rows, b.Columns); for (size_t i = 0; i < a.Rows; i++) { for (size_t j = 0; j < b.Columns; j++) { //在进行默认构建时,所有矩阵中的数据全为1,所以此处需要进行置0 c.M[i][j] = 0; for (size_t k = 0; k < a.Columns; k++) { c.M[i][j] += a.M[i][k] * b.M[k][j]; } } } return c; } int main(int argc, char **argv) { std::cout << "开始执行矩阵运算:(输入0退出程序)" << endl; while (true) { std::cout << "请输入矩阵的阶数:" << endl; int len = 0; cin >> len; cout << "您输入的矩阵阶数为:" << len << endl; if (len < 1) { cout << "无效的阶数:" << len << endl; return 0; } Matrix Ma(len, len, 10); //Ma.printMatrix("随机生成的方阵Ma如下:"); Matrix Mb(len, 1, 10); //Mb.printMatrix("随机生成的列向量Mb如下:"); auto t1 = chrono::steady_clock::now(); Matrix Mc = mulMatrix(Ma, Mb); auto t2 = chrono::steady_clock::now(); double timeSpan = chrono::duration<double, std::milli>(t2 - t1).count(); printf("总用时为:%f ms", timeSpan); //Mc.printMatrix("----------Ma*Mb的结果如下:----------"); } return 0; }
2.后期的扩展方向:
- 将结构体封装为一个类,
- 编写其他的矩阵操作函数
- 运算符的重构
-
OpenCV:如何生成一个随机矩阵
2020-09-05 09:24:56这样就生成了一个(3, 32, 32)的矩阵,而OpenCV也提供了方法进行生成: #include<iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat a(32, 32, CV_32...在pytorch中,我们可以很轻易地生成
import torch torch.randn(3, 32, 32)
这样就生成了一个(3, 32, 32)的矩阵,而OpenCV也提供了方法进行生成:
#include<iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat a(32, 32, CV_32FC3); // 实例化一个随机数发生器 RNG rng; // 使用fill方法 rng.fill(a, RNG::UNIFORM, 0.f, 1.f); // 输出结果 cout << a << endl; cout << a.size << endl; return 0; }
void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false ); InputOutputArray 输入输出矩阵,最多支持4通道,超过4通道先用reshape()改变结构 int distType UNIFORM 或 NORMAL,表示均匀分布和高斯分布 InputArray a disType是UNIFORM,a表示为下界(闭区间);disType是NORMAL,a均值 InputArray b disType是UNIFORM,b表示为上界(开区间);disType是NORMAL,b标准差 bool saturateRange=false 只针对均匀分布有效。当为真的时候,会先把产生随机数的范围变换到数据类型的范围,再产生随机数; 如果为假,会先产生随机数,再进行截断到数据类型的有效区间。请看以下fillM1和fillM2的例子并观察结果
-
C语言如何生成一个随机矩阵
2021-05-20 07:53:33生产随机的矩阵的关键在于使用随机函数rand()。rand()表头文件:#include<stdlib.h>定义函数:intrand(void)函数说明:因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以... -
C++:使用`rand()`或Eigen生成随机数、随机矩阵时,输出结果总是一样
2021-04-04 16:04:23如题 文章目录 原代码 运行三次结果输出: 解决方法 运行结果 参考 原代码 #include using std::cout; int main() { for (int i = 0; i ; i++) { cout () ; } } 运行三次结果输出... 参考 C++产生随机数一直重复的问题 -
C++利用Eigen生成任意规模稀疏矩阵
2021-08-23 17:24:24批注:这里随机生成非零位置未排除重复位置,可能事实稀疏度会略低于给定的稀疏度。 #include "iostream" #include "Eigen/SparseCore" #include "time.h" using namespace std; using namespace Eigen; Spa.. -
C语言/C++如何生成随机数
2020-12-31 16:29:19本文分享了C语言/C++如何生成随机数的具体实现方法,供大家参考,具体内容如下 C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。 (1) 如果你只要... -
c++实现求矩阵行列式
2011-12-26 13:31:09c++实现求矩阵的行列式值,通过递归方式求解。 -
C++生成一个随机二维数组并作为参数返回
2021-04-24 00:06:07前言我是遥感专业,专职遥感图像处理 ,我们知道遥感影像就是一个个数组,或者说矩阵,所以说对影像操作就是对数组操作,所以学习数组的用法极为重要。我们知道C++中的return只能返回一个数值,而不能返回一个数组,... -
Eigen库生成随机数矩阵
2022-04-30 10:22:29Eigen矩库的Random函数可用来生成随机数矩阵,其中生成整数类型的矩阵时,数字值随机分布,生成浮点数类型的矩阵时,生成的随机数范围在[-1:1]内。 对应的Random也有三种使用变形: 1.第一种为n*n的矩阵; 2.第 -
旋转矩阵C++
2022-02-14 15:23:21旋转矩阵C++ 题目介绍 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 示例 1: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ... -
自动生成一个可爱的矩阵(Visual C++版本)
2021-05-20 07:52:06该楼层疑似违规已被系统折叠隐藏此楼查看此楼例如输入5,自动生成刑如01020304051617181906152425200714232221081312111009的东西程序代码如下(可能有点复杂,小弟刚刚开始学习C语言哈^_^)#includevoidmain(){inta... -
C语言如何随机生成一个矩阵
2021-05-20 07:53:43C语言如何随机生成一个矩阵发布时间:2020-10-19 18:13:23来源:亿速云阅读:270作者:Leah这篇文章将为大家详细讲解有关C语言如何随机生成一个矩阵,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完... -
随机矩阵 int mat[8][8]。c++找出矩阵mat中的所有极点与鞍点。(运用函数)
2020-01-03 17:41:23c++函数 设已知矩阵 int mat[8][8]。如某元素在所在行与所在列中均为最大值或最小值,则被称为极点;如某元素在所在行中是最大值,在所在列中是最小值,则被称为鞍点。编程找出矩阵mat中的所有极点与鞍点。(本人萌... -
C/C++实现矩阵的转置(示例代码)
2020-09-04 23:02:55C/C++实现矩阵的转置(示例代码)需要的朋友可以过来参考下,希望对大家有所帮助 -
C++如何创建对角矩阵
2020-08-12 22:12:56问题描述 如题所述 解决方案 #define SIZE 3 int eye[SIZE][SIZE] = {0}; int main() { for (int i = 0; i < SIZE ; ++i) { eye[i][i] = 1;...Initialize an “eye” (identity) matrix array in C -
在C++中实现矩阵运算(Eigen基础使用)
2020-12-01 20:38:23在C++中实现矩阵运算(Eigen基础使用) 很多使用过matlab的人肯定对于其中方便的矩阵运算有很深的印象,那么如何在C++上同样实现像matlab一样的便捷计算呢?最近新学到了一个名为Eigen的库,这里记录一下希望加深... -
c++生成随机平面无向连通图
2020-09-14 17:29:50前言:为了检验路径搜索算法的优劣,需要用大量的图的数据来运行对应的算法,例如深度优先搜搜、宽度优先搜索、迪杰斯特拉算法等等,而对于大多数实际问题,例如...基于此需求,本人想出了一个随机生成平面无向图的算法 -
建立随机矩阵,及生成新矩阵
2019-01-02 10:08:06首先要说的是建立随机数: 用rand()函数建立(0,1)之间的随机数。... 建立二维n * n的随机矩阵。 A = [1, 2 ,3; 4, 5, 6; 7 ,8, 9]; triu(A); %输出上三角 输出: ans = 1 2 3 ... -
C++产生随机数,随机序列和随机分布
2020-02-22 13:36:001.产生[0 N-1]区间的一个随机整数 2.产生一个[0 1]区间的随机小数 3.产生一个[0 N-1]区间的随机序列 4.产生服从某个分布的概率随机数 1.产生[0 N-1]区间的一个随机整数 #include <iostream> #include<... -
数据结构 C/C++ 三角矩阵
2020-01-09 14:18:14#include<stdio.h> int main() { int M,N; printf("请输入矩阵阶数n:"); scanf("%d",&N); int a[N][N],i,j,t=0;...C: printf("请选择三角矩阵类型:\n1.上三角矩阵\n2.下三角矩阵\n... -
c++ Eigen矩阵运算
2020-12-04 20:20:08算法中总会存在大量的矩阵运算,eigen提供便捷又强大的矩阵运算库,将理论可在C++中得以实现。 一下内容为基于官方教程进行的总结,官方教程地址: http://eigen.tuxfamily.org/dox/GettingStarted.html 一、定义... -
【C/C++开源库】C/C++矩阵运算开源库
2021-08-20 01:17:20文章目录一、C++矩阵...深入学习三、C++矩阵运算库 - boost四、C语言矩阵运算库 -1.C语言矩阵库12.C语言矩阵库23.C语言矩阵库34.C语言矩阵库45.C语言矩阵库56.C语言矩阵库67.C语言矩阵库78.C语言矩阵库89.C语言矩阵库 -
快速生成N*N的随机矩阵
2019-10-17 10:22:25实测单线程生成10000*10000的随机数矩阵只要2s 核心思想在于将二维矩阵转化为一维数组进行操作 编译:g++ -std=c++11 randomMaker.cpp -o randomMaker 运行:./randomMaker <dimension> randomMaker.cpp: #... -
C++实现随机产生一个二维数组
2018-03-15 14:33:00//要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; //要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; //要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; } cout ; } return 0; } -
C++ 快速随机数生成器
2021-05-24 01:42:51因为大多情况下我有大约超过500个节点,我需要随机地选择至少1/3的节点进行交换。所以我需要一个快速产生随机数的函数(标准函数rand()太慢了)。不需要多么巧妙,差不多就行了。注:忘了说,我无法使用除了标准库... -
8.随机生成一个矩阵并对其转置
2020-09-26 17:05:14(1)随机初始化一个5*5的矩阵,并输出; (2)将其传递给函数,实现矩阵转置;...//生成5*5随机矩阵 void gr_juzhen(int a[][5],int max_size ) { // int i,j; srand(time(NULL)); for(int i=0;i< -
C++实现稀疏矩阵的操作,三元组存储---数据结构
2020-12-26 22:55:20(1) 输入的形式和输入值的范围:无需自己输入数据,程序是可以自动生成一个稀疏矩阵并输出在界面中。 (2)输出的形式:建立成功后会将三元组表中的数据按照每个元素所在的行号,列号输出元素值;稀疏矩阵的加法则... -
C++计算矩阵的最大最小值MaxMin和最小最大值MinMax。
2022-05-21 16:44:18假设m×n 矩阵为A ,定义它的最大最小值为每一行最小值中的最大值: MaxMin=Maxi=1mMinj=1nAij 最小最大值定义为每一行最大值中的最小值: MinMax=Mini=1mMaxj=1nAij 例如A=153476 ,那么: RowMin=Minj=1nA1...