矩阵转置的函数怎么编(用c++)

fengyucaihong 2007-03-27 08:56:50
大家好:
请教问题:用c++ 怎么编矩阵转置的函数,原矩阵和转置矩阵保存在二维数组中。
...全文
3956 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouli669826 2011-06-10
  • 打赏
  • 举报
回复
确实蛮复杂啊 呵呵
tian_dao_chou_qin 2009-09-06
  • 打赏
  • 举报
回复
楼上的写的怎么都那么复杂啊?
LudwigvanBeethoven 2007-10-08
  • 打赏
  • 举报
回复

/*******************************************************************************
* Function : void *mtxrot(void *mtx)
* Author : lovecreatesbeauty@gmail_Del.com [Remove _Del for email]
* Date : 2007.10.7
* Description: Rotate a matrix of integers of any size by 90 degrees colckwise
* if its length equals to width, for example,
*
* for a 5 x 5 matrix:
*
* 1 2 3 4 5
* 6 7 8 9 10
* 11 12 13 14 15
* 16 17 18 19 20
* 21 22 23 24 25
*
* 21 16 11 6 1
* 22 17 12 7 2
* 23 18 13 8 3
* 24 19 14 9 4
* 25 20 15 10 5
*
*
* for a 6 x 6 matrix:
*
* 1 2 3 4 5 6
* 7 8 9 10 11 12
* 13 14 15 16 17 18
* 19 20 21 22 23 24
* 25 26 27 28 29 30
* 31 32 33 34 35 36
*
* 31 25 19 13 7 1
* 32 26 20 14 8 2
* 33 27 21 15 9 3
* 34 28 22 16 10 4
* 35 29 23 17 11 5
* 36 30 24 18 12 6
*
******************************************************************************/

iu_81 2007-03-27
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
#define RANK 3 // N 阶矩阵
#define DEBUG //调试
////////////////////////////////////////////////////////////////////////
//判断数组内是否全为数字型
bool IsNum(char* num)
{
int flag = 0;
unsigned long Len;
Len = strlen(num);
for (int i = 0;i < Len;i ++)
{
if (num[i] < '0' || num[i] > '9') //非数字
{
if (num[i] == '.') //是小数点
{
if (flag) //多个小数点
{
return false;
}
flag = 1;
}
else //非小数点
{
return false;
}
}
}
return true;
}
/////////////////////////////////////////////////////////////////////////////
int main(void)
{
int i,j;
double *p; //指向一个一维数组
p = new double[RANK * RANK]; //动态分配
#ifdef DEBUG
//测试用(自动填充)
for (int k=0; k<RANK * RANK; k++)
*(p+k) = 1+k;
#else
//用户输入
char Input[50];
cout<<"请输入"<<RANK<<"阶矩阵的元素:"<<endl<<endl;
for (i = 0; i < RANK; i ++)
{
for (j = 0; j < RANK; j ++)
{
error:
cout<<"请输入第"<<i+1<<"行,第"<<j+1<<"个元素为:";
cin>>Input;
if (strlen(Input) >= 50) //输入过长
{
cout<<"你输入的值过长,请重新输入!"<<endl;
goto error;
}
else if (! IsNum(Input)) //检测合法性
{
//不合法
cout<<"你输入的值不合法,请重新输入!"<<endl;
goto error;
}
else
{
*(p + i * RANK + j) = atof( Input );
}
}
}
#endif
//显示用户输入
cout<<"用户输入为"<<RANK<<"阶矩阵:"<<endl;
for (i = 0; i < RANK; i ++)
{
for (j = 0; j < RANK; j ++)
{
cout<<*(p + i * RANK + j)<<"\t";
}
cout<<endl<<endl;
}
//开始转置
for (i = 0; i < RANK; i ++)
{
for (j = i; j < RANK; j ++)
{
if ( i != j ) //不在对角线上
{
//两数交换
*(p + i * RANK + j) += *(p + j * RANK + i); //a=a+b
*(p + j * RANK + i) = *(p + i * RANK + j) - *(p + j * RANK + i); //b=a-b
*(p + i * RANK + j) -= *(p + j * RANK + i); //a=a-b
//异或好像不能对double型进行操作,所以,用加减来代替
// *(p + i * RANK + j) ^= *(p + j * RANK + i); //a=a^b
// *(p + j * RANK + i) ^= *(p + i * RANK + j); //b=a^b
// *(p + i * RANK + j) ^= *(p + j * RANK + i); //a=a^b
}
}
}
//显示转置结果
cout<<"转置后的结果为:"<<endl;
for (i = 0; i < RANK; i ++)
{
for (j = 0; j < RANK; j ++)
{
cout<<*(p + i * RANK + j)<<"\t";
}
cout<<endl<<endl;
}
return 1;
}
jixingzhong 2007-03-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

double * MatrixOpp(double *A,int m,int n); /*矩阵求逆*/
double * MatrixInver(double *A,int m,int n); /*矩阵转置*/
double Surplus(double A[],int m,int n); /*求矩阵行列式*/

double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/
{
int i,j,x,y,k;
double *SP=NULL,*AB=NULL,*B=NULL,X,*C;
SP=(double *)malloc(m*n*sizeof(double));
AB=(double *)malloc(m*n*sizeof(double));
B=(double *)malloc(m*n*sizeof(double));

X=Surplus(A,m,n);
X=1/X;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
for(k=0;k<m*n;k++)
B[k]=A[k];
{
for(x=0;x<n;x++)
B[i*n+x]=0;
for(y=0;y<m;y++)
B[m*y+j]=0;
B[i*n+j]=1;
SP[i*n+j]=Surplus(B,m,n);
AB[i*n+j]=X*SP[i*n+j];
}
}
C=MatrixInver(AB,m,n);

return C;
}

double * MatrixInver(double A[],int m,int n) /*矩阵转置*/
{
int i,j;
double *B=NULL;
B=(double *)malloc(m*n*sizeof(double));

for(i=0;i<n;i++)
for(j=0;j<m;j++)
B[i*m+j]=A[j*n+i];
return B;
}

double Surplus(double A[],int m,int n) /*求矩阵行列式*/
{
int i,j,k,p,r;
double X,temp=1,temp1=1,s=0,s1=0;

if(n==2)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if((i+j)%2) temp1*=A[i*n+j];
else temp*=A[i*n+j];
X=temp-temp1;
}
else
{
for(k=0;k<n;k++)
{
for(i=0,j=k;i<m,j<n;i++,j++)
temp*=A[i*n+j];
if(m-i)
{
for(p=m-i,r=m-1;p>0;p--,r--)
temp*=A[r*n+p-1];
}
s+=temp;
temp=1;
}

for(k=n-1;k>=0;k--)
{
for(i=0,j=k;i<m,j>=0;i++,j--)
temp1*=A[i*n+j];
if(m-i)
{for(p=m-1,r=i;r<m;p--,r++)
temp1*=A[r*n+p];}
s1+=temp1;
temp1=1;
}
X=s-s1;
}
return X;
}

/* Test */
int main()
{
int i,j;
double arr[5][5], *result, *t=arr;
for(i=0; i<5; i++)
for(j=0; j<5; j++)
scanf("%lf", &arr[i][j]);

result=MatrixOpp((double *)arr,5,5); //求逆

/*...其他操作,如显示结果*/
printf("\n\nThe result is:\n");
for(i=0; i<5*5; i++)
{
printf("%lf\t", *(result+i));
if(i%5==4)printf("\n");
}
free(result);
system("PAUSE");
return 0;
}
xlbdan 2007-03-27
  • 打赏
  • 举报
回复
我上面写的是用二维数组做的,不同于前两位一维数组,我试过了好用的程序,楼主可以试一下
void Reverse(int (*a)[3],int n)
这个函数没办法,只能传一个(*a)[3]这样的已知量,后面的n其实没有用了,楼主自己可以改一改,删除它也是一样的.

转置的算法是正确的,我试过,你可以根据你的需要改一下
xlbdan 2007-03-27
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void Reverse(int (*a)[3],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
swap(a[i][j],a[j][i]);
}
}

void main()
{
int a[3][3],i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cin>>a[i][j];
}

Reverse(a,3);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧