(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. VB.NET利用正則表達式巧妙限制字符输入

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010028869/article/details/37913867     在通常的程序设计中.对 ...

  2. 【转】tomcat系统架构分析

    https://blog.csdn.net/wsl211511/article/details/51622991

  3. JDBC_数据库连接池DRUID

    /** * @Description: TODO(这里用一句话描述这个类的作用) * @Author aikang * @Date 2019/8/26 20:12 */ /* 1.数据库连接池: 1. ...

  4. range和arange

    a = np.arange(12) print(a, type(a)) b = range(10) print(b, type(b)) li = list(b) print(li) 拓展: 两个参数: ...

  5. vue 挂载点 实例 模板

    挂载点:vue实例 里面的el属性 对应的 id 所在的dom节点 模板:指的是挂载点内部的内容           模板可以写在挂载点内部           也可以写在属性里面 demo < ...

  6. case in

    #!/bin/bash source /etc/profilesource ~/.bashrc #自己定义$version_number case $version_number in3.0.17) ...

  7. Allegro文档错误之:Iangle 命令

    Allegro绘制弧线时,可以使用add rarc命令,或者菜单栏里 Add|Arc w/Radius. 使用该命令时,需要输入3个参数: 1,圆心坐标:如 x –0.3 –0.8 2,半径,以及起始 ...

  8. Vim统计字符串出现次数

    关键命令: :%s/pattern//gn 参数说明: % - 指明操作区间,%表示全文本:可以使用1,$或者行区间代替 s – substitute,表示替换 pattern - 要查找的字符串 / ...

  9. dos中文乱码怎么办?

    最简单的方法: 通过 chcp命令改变代码页,UTF-8的代码页为65001 即chcp 65001 chcp 65001  就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp ...

  10. LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)

    传送门 解题思路 玄学树形\(dp\),题目描述极其混乱...看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟.所以 ...