在线等:不另申请空间,转置矩阵的算法

Creamdog 2004-11-11 10:11:32
求不另申请空间,转置矩阵的算法,矩阵的行列可不相等!
分不够可以再加,谢诸位大侠了!
...全文
371 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao12m 2004-12-11
  • 打赏
  • 举报
回复
按错键拉不好意思 比如说
1 2 3
4 5 6
进去出来后就成拉6 5 4
3 2 1
再进6 3
5 2
4 1

出来就成拉1 4
2 5
3 6
哈哈简单把不过要用到栈你也可以不用栈完成以上功能
你也可以用三元组法该一下下标就好拉

cao12m 2004-12-11
  • 打赏
  • 举报
回复
最简单的一种算法就是那样意思很简单你比如说 1 2 3
4 5 6
cao12m 2004-12-11
  • 打赏
  • 举报
回复
把所有元素按行优先推入栈中再按行出来再按列优先推进去按行取出来 第二次出来时候是行列交换这样就好拉
mathe 2004-11-29
  • 打赏
  • 举报
回复
假设原先矩阵是W*H的,那么变换以后的矩阵是H*W的
对于任何一个原先矩阵中位置为(i,j)的元素,它存放的位置为
i*H+j,那么变换后,位置为j*W+i.
我们就可以使用上面的算法依次把每个元素移动到它的新位置,只是在移动之前,
先要保存新位置上元素到一个临时变量中。由于要求不开辟新内存,我们只能使用
最多常数个变量,所以下一步就应该新位置上面的元素((j*W+i)/H,(j*W+i)%H)。
现在的问题是我们如何判断一个元素是否已经被移动了,就可以了。

for(int i=0;i<W;i++){
for(int j=0;j<H;j++){
//code to judge whether location (i,j) has been moved.
int start=i*H+j;
int i0=i,j0=j;
int next;
do{
next=j0*W+i0;
i0=next/H;j0=next%H;
}while(next>start);
if(next==start){ //The location (i,j) has not been moved.
float tmp=a[start];
i0=i,j0=j;
do{
float tmp2;
next=j0*W+i0;
i0=next/H;j0=next%H;
tmp2=a[next];
a[next]=tmp;
tmp=tmp2;
}while(next!=start);
a[start]=tmp;
}
}
}
LoveCreatesBeauty 2004-11-28
  • 打赏
  • 举报
回复
Rotate a 3*3 array of int by 90 degrees clockwise
http://www.cnblogs.com/lovecreatesbeauty/archive/2004/09/25/46508.html
qrlvls 2004-11-26
  • 打赏
  • 举报
回复
for里面的变量不算是另外申请空间对吧,呵呵,看来还是汇编管用
rickone 2004-11-26
  • 打赏
  • 举报
回复
转置有什么用?
我看干脆不用交换,只把下标换一下就行了。
a[i][j]是n*m矩阵,转置成b[i][j] m*n,就反过来读,b[i][j]=a[j][i]
写一个读矩阵元素的函数getvalue(i,j,t),t标识是否是转置后的矩阵,不是就返回a[i][j],否则返回a[j][i]。
行不行?
pcboyxhy 2004-11-26
  • 打赏
  • 举报
回复
int *p = new int[ n*n ];
a[i][j]就是*(p+ n*i +j)
管他几维的数组,
全部化为一维的
NowCan 2004-11-11
  • 打赏
  • 举报
回复
行列不等,转置后怎么可能放在原来的矩阵里?
Creamdog 2004-11-11
  • 打赏
  • 举报
回复
楼上的,行列不相等时怎么交换啊
寻开心 2004-11-11
  • 打赏
  • 举报
回复
解决交换两个变量不利用中间变量的办法就可以了

对于两个变量a和b,交换他们数值的办法有很多
主要根据他们的类型来选择合适的办法
对于矩阵应该说是浮点类型,可以用:
a=a+b
b=a-b
a=a-b

转置就可以按照两两交换无需其他变量的方法一次交换就可以了e,
寻开心 2004-11-11
  • 打赏
  • 举报
回复
多加一个判断就可以了
假定原来的矩阵是M*N
转置后的就是N×M
for ( int i=0; i<n; i++ )
for (int j=0; j<m; j++ ) {
if (j>i)
交换新矩阵i,j位置,和老矩阵i,j位置
else
交换新矩阵i,j位置,和老矩阵j,i位置
}
注: 新矩阵i,j位置就是 数组的 (i-1)*m + j-1
老矩阵i,j位置就是 数组的 (i-1)*n + j-1

比如一个5×3的矩阵,假定数值就是 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35
按照上述算法,i=0时候,交换完成的结果就是
11 21 31 14 15 12 22 23 24 25 13 32 33 34 35
i=1交换完成后的结果就是
11 21 31 12 22 32 14 15 34 24 25 13 12 33 34 35
...
最终结果就是
11 21 31 12 22 32 13 23 33 14 24 34 15 25 35

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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