(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. C++之程序流程_选择结构

    C/C++支持最基本的三种程序运行结构:==顺序结构.选择结构.循环结构== * 顺序结构:程序按顺序执行,不发生跳转* 选择结构:依据条件是否满足,有选择的执行相应功能* 循环结构:依据条件是否满足 ...

  2. 6-MySQL高级-索引

    索引 1. 思考 在图书馆中是如何找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询操作时有1次写的操作), 而且插入操作和更新操作很少出现性能问题, 遇到最多.最容易出 ...

  3. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

  4. iOS开发系列-Lock

    概述 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. iOS中锁之前的性能的图标排行: ...

  5. pdfkit

    官方文档 0.准备 需要引入两个包,首先要npm install pdfkit安装pdfkit包 const PDF = require('pdfkit'); const fs = require(' ...

  6. [JZOJ6272] 2019.8.4【NOIP提高组A】整除

    题目 题目大意 求方程\((x^m-x)\mod n=0\)在整数范围\([1,n]\)的解的个数. \(n=\sum_{i=1}^{c}p_i\) 给出\(c\)和\(p_i\) 思考历程 作为数论 ...

  7. js结巴程序

    var str="我.....我是一个个......帅帅帅帅哥!"; var reg=/\./gi; str=str.replace(reg,""); reg= ...

  8. 期望dp——zoj3640

    /* dp[i]表示力量为i时的期望 dp[i]=sum{tj}/n+sum{dp[i+cj]+1}/n //前一项是cj<i的和,后一项是cj>=i的和 初始状态dp[m] */ #in ...

  9. UpdateLayeredWindow与SetLayeredWindowAttributes

    首先使用透明之前必须设置该窗口为层级窗口,即增加窗口的扩展风格WS_EX_LAYERED,增加的时候最好使用GetWindowlong获取Ex风格,然后加入后在SetWindowLong设置,最好不适 ...

  10. selenium基础(警告框的处理)

    selenium基础(警告框的处理) 在webdriver中处理JavaScript所产生的的警告框有三种类型 alert confirm prompt 划转到警告框的方法是:driver.switc ...