(算法)求矩阵转置

题目:

编写一个函数,输入为一个矩阵,打印这个矩阵转置后的结果。

例:

输入矩阵是

1,2,3,4

5,6,7,8

9,10,11,12

13,14,15,16

打印结果应该是

13,9,5,1

14,10,6,2

15,11,7,3

16,12,8,4

思路:

1、从外到内,一圈一圈地循环替换;

2、对矩阵进行从[i,j]到[j,i]的交换,然后在进行列的首尾交换;

代码:

#include<iostream>
#include<vector>

using namespace std;

void RotateMatrix_1(vector<vector<int> > &matrix,int n){
    for(int layer=0;layer<n/2;++layer){
        int first=layer;
        int last=n-1-layer;
        for(int i=first;i<last;++i){
            int offset=i-first;
            // store top
            int top=matrix[first][i];

            // left to top
            matrix[first][i]=matrix[last-offset][first];

            // bottom to left
            matrix[last-offset][first]=matrix[last][last-offset];

            // right to bottom
            matrix[last][last-offset]=matrix[i][last];

            // top to right
            matrix[i][last]=top;
        }
    }

}

void swap(int &a,int &b){
    int tmp=a;
    a=b;
    b=tmp;
}

void RotateMatrix_2(vector<vector<int> > &matrix,int n){
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++)
            swap(matrix[i][j],matrix[j][i]);
    }
    /*
    // Reverse clock-wise
    for(int i=0;i<n/2;i++){
        for(int j=0;j<n;j++)
            swap(matrix[i][j],matrix[n-1-i][j]);
    }
    */

    // clock-wise
    for(int i=0;i<n/2;i++)
        for(int j=0;j<n;j++)
            swap(matrix[j][i],matrix[j][n-1-i]);
}

int main(){
    vector<vector<int> > matrix={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };

    int n=matrix.size();

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            cout<<matrix[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;

    RotateMatrix_2(matrix,n);

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            cout<<matrix[i][j]<<" ";
        cout<<endl;
    }

    return 0;
}
时间: 2024-10-17 21:45:27

(算法)求矩阵转置的相关文章

1154: 零起点学算法61——矩阵转置

1154: 零起点学算法61--矩阵转置 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1324  Accepted: 698[Submit][Status][Web Board] Description 现要求你把一个矩阵行列转置后输出,注意行数和列数可能不相同的. Input 多组测试数据,每组测试数据先在一行输入n 和m ,表示这个矩阵的行数和列数(1 < n,m <= 10) 然后是n行

C语言之基本算法42—矩阵转置及按行按列排序

//矩阵转置 按行按列排序 /* ================================================================== 题目:输入m*n矩阵,按行升序排列输出. 输入: 4 3 5 6 2 9 8 1 2 8 7 1 2 3 8 输出: 2 3 4 5 6 1 2 8 8 9 1 2 3 7 8 ================================================================== */ #includ

雅可比算法求矩阵的特征值和特征向量

目的 求一个实对称矩阵的所有特征值和特征向量. 前置知识 对于一个实对称矩阵\(A\),必存在对角阵\(D\)和正交阵\(U\)满足\[D=U^TAU\]\(D\)的对角线元素为\(A\)的特征值,\(U\)的列向量为\(A\)的特征向量. 定义\(n\)阶旋转矩阵\[G(p,q,\theta)= \begin{bmatrix} 1 & & & & & \cdots& & & & & 0\ &\ddots &

java 矩阵转置算法

工作中用到了行列转置,把这两种情况的算法记下来,以便后用 1.行列数相等的转置 1 /** 2 * @description 矩阵转置 3 * @author oldmonk 4 * @time 2017年8月18日 5 */ 6 public class test { 7 8 public static void main(String [] args) { 9 int data [][] = new int [] [] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8,

矩阵应用实例及js实现矩阵转置算法

场景: 后端返回的是[['2015-1-1',1,1],['2015-1-2',1,2]]这样的Json数组,代表的意思是2015-1-1这个日期下新增的数据为1,减少的数据为1,2015-1-2这个日期,新增的数据为1,减少的数据为2,但是在统计图表上要在x轴显示时间,y轴显示新增和减少的数据这时,就要把数据转化成[['2015-1-1','2015-1-2'],[1,1],[1,2]]这样的结构,这也可以叫做矩阵的转置. 关于矩阵转置,可以用下图简单说明一下: 图片描述(最多50字) A表示

利用QR算法求解矩阵的特征值和特征向量

利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了好久 1.我要求特征值和特征向量. 2.找到一种算法QR分解矩阵求解特征值 3.QR矩阵分解需要Gram-schimidt正交化分解 有一种很明显的感觉,往往在现在很难有 很系统 很深入 的学习某一个学科的某一门知识. 往往学的时候"靠,学这东西有什么用""学了这么久,也不知道怎么用,不想学" 到后

论如何求矩阵的逆?先看看基础芝士!

这是关于矩阵的一个bugblog (如果觉得格式看不下去请移步:洛咕) 矩阵求逆是个有趣(但暂且不知道有什么神奇运用)的东西, 不过矩阵这玩意儿貌似和线性代数以及向量之类的东西相关,所以学了绝对不亏 xiao 另外,本篇blog 并不一定毫无错误,甚至可能会有些理解上的小偏差,所以请各位观看的神仙及时指出好让作者修改精进,谢谢. 还有矩阵求逆的两种方法将会放在最后讲解 想要学会矩阵求逆的话,首先你得了解几个关于矩阵的概念以及名称的含义 (当然如果你知道这些概念的话可以直接往下跳) 基本概念 1.

_DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int PathMatrix[MaxSize][MaxSize][MaxSiz

Dijkstra算法求最短路径

摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除. 链接算法过程 /* 有向图的构建及最短路径求解(Dijkstra) */ #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 30 #define MAX_INT 1000 typedef int VrType; typedef char VtType; bool visted[MAX_VERTEX_NUM]; //搜索时的标记矩阵 ty