(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日)

  对于任意非n阶矩阵的转置,用c++应该怎么写代码,思考了一下,发现并没有那么简单,上网找到了一个比较好的算法,叫做矩阵原地转置矩阵算法。基于别人的代码,改写成可以使用指针动态分配内存的方法。

  先放传送门:C++实现矩阵原地转置算法的实现

  原理并不难,那篇文章非常的详细,我不再赘述,下面把改写好的代码发出来。

 /*************************************************************************
> File Name: matrix_transpose.cpp
> Author: SongLee
> Modified: JCChan
************************************************************************/
#include<iostream>
using namespace std;
/* 后继 */
int getNext(int i, int m, int n)
{
return (i%n)*m + i / n;
}
/* 前驱 */
int getPre(int i, int m, int n)
{
return (i%m)*n + i / m;
}
/* 处理以下标i为起点的环 */
void movedata(int *mtx, int i, int m, int n)
{
int temp = mtx[i]; // 暂存
int cur = i; // 当前下标
int pre = getPre(cur, m, n);
// 从最后一个数开始,获得它的前驱,直到前驱的值和最后一位值相等,相当于交换的逆过程
while (pre != i)
{
mtx[cur] = mtx[pre];
cur = pre;
pre = getPre(cur, m, n);
}
mtx[cur] = temp;
}
/* 转置,即循环处理所有环 */
void transpose(int *mtx, int m, int n)
{
for (int i = ; i<m*n; ++i)
{
int next = getNext(i, m, n);
while (next > i) // 若存在后继小于i说明重复
next = getNext(next, m, n);
if (next == i) // 处理当前环
movedata(mtx, i, m, n);
}
}
void input(int *mtx, int row, int column) {
for (int i = ; i < row; i++) {
for (int j = ; j < column; j++) {
cout << "请输入矩阵的第" << i + << "行第" << j + << "个元素:";
// 根据矩阵的坐标推算它在一维数组中的位置。
cin >> *(mtx + column*i + j);
}
}
}
/* 输出矩阵 */
void print(int *mtx, int m, int n)
{
for (int i = ; i<m*n; ++i)
{
if ((i + ) % n == )
cout << mtx[i] << "\n";
else
cout << mtx[i] << " ";
}
}
/* 测试 */
int main()
{
int row, column;
cout << "请输入矩阵的行数:";
cin >> row;
cout << "请输入矩阵的列数:";
cin >> column;
int *matrix = new int[row*column];
input(matrix, row, column);
cout << "Before matrix transposition:" << endl;
print(matrix, row, column);
transpose(matrix, row, column);
cout << "After matrix transposition:" << endl;
print(matrix, column, row);
delete[] matrix;
system("pause");
return ;
}

  结果如下

  对于n阶方阵来说,情况则简单的多,同样放上代码。

 #include<iostream>
using namespace std;
void move(int *matrix, int n)
{
int i, j, k;
for (i = ; i<n; i++)
for (j = ; j<i; j++)
{
k = *(matrix + i*n + j);
*(matrix + i*n + j) = *(matrix + j*n + i);
*(matrix + j*n + i) = k;
}
}
int main()
{
int n, i, j;
int *p;
cout << "请输入矩阵的维数:";
cin >> n;
p = new int[n*n];
cout << "输入矩阵的元素" << endl;
for (i = ; i<n; i++)
for (j = ; j<n; j++)
{
cout << "第" << i + << "行第" << j +
<< "个元素为:";
cin >> p[i*n + j];
}
cout << "输入的矩阵的为:" << endl;
for (i = ; i<n; i++)
{
for (j = ; j<n; j++)
cout << p[i*n + j] << " ";
cout << endl;
}
move(p, n);
cout << "转置后的矩阵的为:" << endl;
for (i = ; i<n; i++)
{
for (j = ; j<n; j++)
cout << p[i*n + j] << " ";
cout << endl;
}
delete[] p;
system("pause");
return ;
}

C++写矩阵的转置的更多相关文章

  1. C语言两种方式实现矩阵的转置

    #include"stdio.h" typedef struct{ int i,j; int v; }Triple; typedef struct{ Triple date[]; ...

  2. C语言 矩阵的转置及矩阵的乘法

    C语言 矩阵的转置及矩阵的乘法 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.矩阵的转置 #include<stdio.h> #defi ...

  3. 关于python中矩阵的实现和矩阵的转置

    python中矩阵的实现是靠序列,,, 序列有很多形式, 其实矩阵是现实生活中的东西,把现实生活中的结构转换到程序中. 就需要有个实现的方法,而这种路径是多种多样的. 下面给出一个把矩阵转换成pyth ...

  4. C语言-实现矩阵的转置-随机函数产生随机数并赋予数组中-190222

    //编写程序,实现矩阵的转置(行列互换). #include <stdio.h> #include <conio.h> #include <stdlib.h> ][ ...

  5. 为何D3D11的几个矩阵需要转置?

    在学习D3D11的时候遇到一个问题,事情是这样的: D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Re ...

  6. [CSDN_Markdown] 使用LaTeX写矩阵

    简介 LaTeX 的公式功能非常强大,一次性讲全不是件容易的事情.将LaTeX 的这些功能分成较小的相互独立的部分来讲,一方面方便大家单独查阅:另一方面,所有[CSDN_Markdown]相关的文章都 ...

  7. nyoj299——如何优雅的写矩阵快速幂

    Matrix Power Series 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Given a n × n matrix A and a positive i ...

  8. c++数组-矩阵的转置

    #include <iostream> using namespace std; int main(){ ][]={{,,},{,,}}; ][]; ;j<;j++){ ;i< ...

  9. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

随机推荐

  1. 【72. 编辑距离】【困难】【线性DP】

    给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输 ...

  2. 基于NEO4J的高级检索功能

    基于NEO4J的高级检索 一.需求 二.创建索引 1.索引自动更新配置 2.执行带有索引自动更新配置的过程 三.查询索引 1.LUCENE查询语法 2.实现高级检索的核心:LUCENE QUERY语句 ...

  3. c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)

    一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写 ...

  4. [NOIP2005] 过河【Dp,思维题,缩点】

    Online Judge:Luogu P1052 Label:Dp,思维题,缩点,数学 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子 ...

  5. react添加多个域名proxy代理,跨域

    在package.json中加入如下: { "name": "demo", "version": "0.1.0", &q ...

  6. PandorBox 中安装aria2失败的解决办法

    来自:http://www.right.com.cn/forum/thread-174358-1-1.html 不论luci界面还是opkg中安装,都提示缺少依赖包uclibc,pandorabox默 ...

  7. CCPC 2019 网络赛 1002 array (权值线段树)

    HDU 6703 array   题意:   给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同.   有两种 ...

  8. 【转】5G标准——独立组网(SA)和非独立组网(NSA)

    独立组网模式(SA):指的是新建5G网络,包括新基站.回程链路以及核心网.SA引入了全新网元与接口的同时,还将大规模采用网络虚拟化.软件定义网络等新技术,并与5GNR结合,同时其协议开发.网络规划部署 ...

  9. 执行sql查询,并查看语句执行花费时间

    declare @d datetimeset @d=getdate() select * from A PRINT '[语句执行花费时间(毫秒)]'+LTRIM(datediff(ms,@d,getd ...

  10. Redis单机和集群配置(版本在5.0后)

    摘抄并用于自己后查 单机版的配置: 1. 下载redis压缩包,然后解压缩文件(tar xzf): 2. 进入解压后的redis文件目录,编译redis源文件(make,没有c环境要gcc): 3. ...