读书人

百分矩阵转置算法求解,该怎么处理

发布时间: 2013-01-28 11:49:56 作者: rapoo

百分矩阵转置算法求解
紧急求解,已知一个2*3的数组,
int arr1[2][3] = {0, 1, 2, 3, 4, 5};
int* p1 = (int*)arr1;

定义一个函数,void Fun(int*& p, int row, int col), 调用Fun(p1, 2, 3)之后,能够实现矩阵转置,
即将arr1指向的内存的数组值修改为如下:
0,3,1,4,2,5

即将一个arr[2][3]的数组转换为一个arr[3][2]的数组。
要求:
Fun函数实现中只可以申请三个int栈变量,int i, int j可以用来循环,int temp用来值交换的临时变量。
[解决办法]
//*****************lz自己改成自己想要的吧。
#include<iostream>
#include<ctime>
#include<iomanip>
using namespace std;
void main()
{
const int m=2;
const int n=3;
int matrix[m][n];//矩阵
int tmatrix[n][m];//转置矩阵
int i,j;
cout<<"input m*n matrix:"<<endl;
for(i=0;i<m;i++)//生成矩阵
{
for(j=0;j<n;j++)
{
cin>>matrix[i][j];//给数组元素赋值
cout<<setw(4)<<matrix[i][j]<<" ";//输出矩阵
}
cout<<endl;
}
cout<<"transpose of matrix:"<<endl;
for(i=0;i<n;i++)//得到转置矩阵
{
for(j=0;j<m;j++)
{
tmatrix[i][j]=matrix[j][i];//给数组元素赋值
cout<<setw(4)<<tmatrix[i][j]<<" ";//输出矩阵
}
cout<<endl;
}
}
[解决办法]
调试结果:
input m*n matrix:
0 1 2 3 4 5
0 1 2
3 4 5
transpose of matrix:
0 3
1 4
2 5
Press any key to continue

[解决办法]


#include <stdlib.h>
#include <stdio.h>

int* transpose(int* a, int m, int n)
{
int* b = (int*)malloc(sizeof(int) * m * n);
int i, j;

for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
b[i * m + j] = a[j * n + i];

return b;
}

int main(int argc, char* argv[])
{
int a[2][3] = {0, 1, 2, 3, 4, 5};
int *b = transpose((int*)&a[0][0], 2, 3);
int i, j;

for(i = 0; i < 3; i++)
{
for(j = 0; j < 2; j++)
printf("%d ", *(b + i * 2 + j));
printf("\n");
}

free(b);
return 0;
}

[解决办法]
引用:
引用:转置只有明白了原理写出代码很容易呀

原理当然知道了,可是我想不用申请额外的内存来完成

定义两个矩阵,根据原理,实现矩阵的转置,不需要申请额外的空间
[解决办法]
那可以这样来实现:

#include <stdio.h>

void transpose(int* a, int m, int n)
{
int i, j;
int tn = -1, tm = -1;



for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
{
if(i == tn && j == tm) continue;
if(i == tm && j == tn) continue;

int tmp = *(a + i * m + j);
*(a + i * m + j) = *(a + j * n + i);
*(a + j * n + i) = tmp;

tn = i;
tm = j;
}
}

int main(int argc, char* argv[])
{
int a[2][3] = {0, 1, 2, 3, 4, 5};
int* p = (int*)&a[0][0];
int i, j;

transpose(p, 2, 3);
for(i = 0; i < 3; i++)
{
for(j = 0; j < 2; j++)
printf("%d ", *(p + i * 2 + j));
printf("\n");
}

return 0;
}



引用:
引用:C/C++ code?1234567891011121314151617181920212223242526272829303132#include <stdlib.h>#include <stdio.h> int* transpose(int* a, int m, int n){ int* b = (int*)malloc(s……

[解决办法]
不重新申请内存,你把转职后a[3][2]的内容直接放在a[2]【3】数组里,下面怎么用呀
[解决办法]
这个照楼主的要求,还真得好好考虑下。个人觉得需要把二维数组当作一维数组来处理,然后计算出原二元数组中元素转置后在一元数组中的次序,再按行存入原二维数组,方能满足题中要求。
[解决办法]
#include<iostream>
using namespace std;
int main()
{
void Fun(int* p, int row, int col);
int arr1[2][3] = {{0, 1, 2},{ 3, 4, 5}};
int* p1 = &arr1[0][0];
Fun(p1,2,3);

return 0;
}


void Fun(int* p, int row, int col)
{
int arr[3][2];
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
arr[j][i] = *p++;
}
}
for(int i=0;i<col;i++)
{
for(int j = 0;j<row;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}

读书人网 >C++

热点推荐