首页 > 其他分享 >矩阵转置 O(1)

矩阵转置 O(1)

时间:2024-04-27 16:55:41浏览次数:12  
标签:pre mtx cur 转置 矩阵 int include

矩阵转置
链接为:https://www.acwing.com/problem/content/3595/

使用了辅助空间的:

#include <iostream>
using namespace std;
const int N=110;

int a[N][N];
int b[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a[i][j];
    
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    b[j][i]=a[i][j];
    
     for(int i=1;i<=n;i++)
     {
    for(int j=1;j<=n;j++)
    cout<<b[i][j]<<" ";   
    cout<<endl;
     }
   
    return 0;
    
    
    
}

如果要使用没有辅助空间的,就在原地进行转置的代码如下:
(采用交换的方式,就是按“\”主对角线进行一个反转即可)

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;

int a[N][N];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> a[i][j];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			swap(a[j][i], a[i][j]);

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

还有一个实现,觉得很不错:
附上地址:http://www.jb51.net/article/53715.htm

/************************************************************************* 
  > File Name: matrix_transpose.cpp 
  > Author: SongLee 
 ************************************************************************/ 
#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=0; 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 print(int *mtx, int m, int n) 
{ 
  for(int i=0; i<m*n; ++i) 
  { 
    if((i+1)%n == 0) 
      cout << mtx[i] << "\n"; 
    else 
      cout << mtx[i] << " "; 
  } 
} 
 
/* 测试 */ 
int main() 
{ 
  int matrix[4*2] = {1,2,3,4,5,6,7,8}; 
  cout << "Before matrix transposition:" << endl; 
  print(matrix, 4, 2); 
  transpose(matrix, 4, 2); 
  cout << "After matrix transposition:" << endl; 
  print(matrix, 2, 4); 
  return 0; 
} 

标签:pre,mtx,cur,转置,矩阵,int,include
From: https://www.cnblogs.com/FJCLJ/p/18162215

相关文章

  • 力扣-59. 螺旋矩阵 II
    1.题目题目地址(59.螺旋矩阵II-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix-ii/题目描述给你一个正整数 n,生成一个包含1到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn正方形矩阵matrix。 示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]......
  • Games 101: 旋转矩阵
    旋转矩阵本文主要介绍了旋转矩阵的推导,分为两种方式:旋转坐标旋转坐标轴以下坐标系都是右手坐标系旋转坐标已知坐标点\(A(x_a,y_a)\),旋转\(\theta\)角后变为坐标点\(B(x_b,y_b)\),求解旋转矩阵.\[{\large\begin{align*}\begin{split}x_a&=r_a\cdotcos(\alpha)=......
  • 力扣-54. 螺旋矩阵
    1.题目题目地址(54.螺旋矩阵-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix/题目描述给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:......
  • 矩阵快速幂
    1.参考参考:【矩阵快速幂】简单题学「矩阵快速幂」2.定义2.1定义如果直接求取M^n,时间复杂度是O(n),可以定义矩阵乘法,然后用快速幂算法来加速这里M^n的求取,简化时间复杂度为O(logn)主体思路就是不求M^n而是求M^(n/2),然后先不求M^(n/2),先求M^(n/4)具体实现同......
  • 【刚度矩阵推导】2d frame 单元
    2dframe单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为:\(u=[u_1,u_2,u_3,u_4,u_5,u_6]^{T}\)其局部坐标系下的刚度矩阵可以由2dtruss单元和2dbornoulli-beam单元的刚度矩阵组合而成.使用matlab进行推导:%!b......
  • 【知识点】快速幂与矩阵快速幂
    什么是快速幂,为什么要使用快速幂?Macw:快速幂有好多好处。Penelope:例如?Macw:它比较快。见名知意,快速幂算法可以在非常短的时间内求出一个数的\(n\)次幂。虽然快速幂在初学阶段的应用不算太多,但是快速幂背后的思想是非常值得我们去理解的。举例而言,如果我们要求出\(3^......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......
  • Hessian矩阵以及在血管增强中的应用&mdash;OpenCV实现【2024年更新】
    有别于广为人知的Sobel、Canny等一阶算法,基于Hessian矩阵能够得到图像二阶结果,这将帮助我们深入分析图像本质。Hessian矩阵在图像处理中有着广泛的应用:其中在图像分割领域,包括边缘检测、纹理分析等;在图像增强领域,包括边缘增强、边缘消除等。本文从Hessian矩阵定义出发,通过清晰简......
  • 矩阵
    矩阵的定义:矩阵(matrix)其实就是一个二维数组,第\(i\)行\(j\)列的元素即为\(a_{i,j}\)矩阵的运算:加减:它们均为逐个元素进行。只有同型矩阵之间可以对应相加减。转置:矩阵的转置,就是在矩阵的右上角写上转置「T」记号,表示将矩阵的行与列互换。对称矩阵转置前后保持不变。乘......