鱼C论坛

 找回密码
 立即注册
查看: 2276|回复: 35

[已解决]分块矩阵转置

[复制链接]
发表于 2021-9-20 16:42:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么指向 分块的二维数组
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;

  4. void
  5. TransposeMatri(int **array,int n){//全部转置
  6.     for(int i=0;i<n;i++)
  7.       for(int j=0;j<n;j++){
  8.             if(j>i)//主副三角
  9.               swap(array[i][j],array[j][i]);   
  10.       }
  11. }
  12. void
  13. Block_transpose(int **array,int n){ //分块转置
  14.     int k =2;
  15.      for(int i=0;i<n;i+=k)
  16.        for(int j=0;j<n;j+=k)
  17.           TransposeMatri(&(array[i]+j),k);//这里怎么指向分块的二维数组呢
  18. }
  19. int main(){
  20.     int **a= new int *[2];
  21.      for(int i=0;i<2;i++)
  22.         a[i]=new int [2];
  23.         a[0][0]=1; a[0][1]=2;a[1][0]=3;a[1][1]=4;

  24.       Block_transpose(a,2);

  25.        for(int i=0;i<2;i++){
  26.              for(int j=0;j<2;j++)
  27.              cout<<a[i][j]<<' ';
  28.           cout<<endl;
  29.        }
  30.       
  31.      
  32.     return 0;
  33. }
复制代码

这个会报错
  1. TransposeMatri(&(array[i]+j),k);
复制代码


咋解决呀 或者思路错了吗
最佳答案
2021-9-21 10:43:44
其实对于调试程序,输入和输出是很重要的,不知道输出就不知道努力的方向,不知道应该把程序调试成什么样子,不知道应该通过调试让程序输出什么
而输出依赖于输入
正确的输出依赖于正确的输入,知道了输入和输出问题就简单了,因为你知道正确的输出,就知道了要把程序调试成什么样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 16:57:17 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-20 17:00 编辑
  1. TransposeMatri(int **array,int n){//全部转置
  2.     for(int i=0;i<n;i++)
  3.       for(int j=0;j<n;j++){
  4.             if(j>i)//主副三角
  5.               swap(array[i][j],array[j][i]);   
  6.       }
  7. }
复制代码

计算机能明白array二维数组的行和列各为多少吗?
array[2][3]里的array[1][0]和array[3][2]里的array[1][0]的值能一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 17:14:28 | 显示全部楼层
看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 17:38:57 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-20 18:10 编辑

  1. TransposeMatri(&(array[i]+j),k);
  2. (array[i]+j)是值不是变量怎么可能有指针

  3. &(5+6);一样
  4. 你可以
  5. int *tmp=array[i]+j;
  6. TransposeMatri(&(tmp),k);
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 18:25:01 | 显示全部楼层
哦哦 解决了。。
  1. TransposeMatri((int**)((int*)array+i*k+j),k);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 18:29:01 | 显示全部楼层
人造人 发表于 2021-9-20 17:14
看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码

就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 18:39:03 | 显示全部楼层
万千只cnm 发表于 2021-9-20 18:29
就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2
  1. TransposeMatri(int **array,int n){//全部转置
  2.     for(int i=0;i<n;i++)
  3.       for(int j=0;j<n;j++){
  4.             if(j>i)//主副三角
  5.               swap(array[i][j],array[j][i]);   
  6.       }
  7. }
复制代码

不能理解不说明行和列,怎么可能用二维数组表达
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 18:45:59 | 显示全部楼层
万千只cnm 发表于 2021-9-20 18:29
就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2

也就是说,如果是 8x8,那就先分成 4x4,然后再分成 2x2,是这样吧?
这个程序输出是什么?这样?
  1. 1 3
  2. 2 4
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 18:58:35 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-20 19:02 编辑
万千只cnm 发表于 2021-9-20 18:29
就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2

  1. void
  2. TransposeMatri(int **array,int n){//全部转置
  3.     for(int i=0;i<n;i++)
  4.       for(int j=0;j<n;j++){
  5.             if(j>i)//主副三角
  6.               swap(array[i][j],array[j][i]);   
  7.       }
  8. }
  9. void
  10. Block_transpose(int **array,int n){ //分块转置///////////////////////////////////////////////////这个函数没有用
  11.     int k =4;\\\\\\\\\\\\k=2出错
  12.      for(int i=0;i<n;i+=k)
  13.        for(int j=0;j<n;j+=k)
  14.            TransposeMatri((int**)((int*)array+i*k+j),k);//这里怎么指向分块的二维数组呢
  15. }
  16. int main(){
  17.     int **a= new int *[4];
  18.      for(int i=0;i<4;i++)
  19.         a[i]=new int [4];
  20.       
  21.          for (int i = 0; i < 4; i++)
  22.          {
  23.                  for (int j = 0; j < 4; j++)
  24.                  {
  25.                          a[i][j]=i*4+j;
  26.                  }
  27.          }
  28.           for(int i=0;i<4;i++){
  29.              for(int j=0;j<4;j++)
  30.              cout<<a[i][j]<<' ';
  31.           cout<<endl;
  32.        }
  33.       //Block_transpose(a,4);/////////这个函数没有用
  34.       TransposeMatri (a,4);
  35.        for(int i=0;i<4;i++){
  36.              for(int j=0;j<4;j++)
  37.              cout<<a[i][j]<<' ';
  38.           cout<<endl;
  39.        }
  40.       
  41.      
  42.     return 0;
  43. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 21:45:19 | 显示全部楼层

我思路错了 分成小块的话。。主对角线也会对换
for(int i=0;i<n-k;i+=k)
       for(int j=0;j<n;j+=k)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 21:47:56 | 显示全部楼层
人造人 发表于 2021-9-20 18:45
也就是说,如果是 8x8,那就先分成 4x4,然后再分成 2x2,是这样吧?
这个程序输出是什么?这样?

如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵
但我现在如果分成子矩阵,主对角线也会调换。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 21:54:16 | 显示全部楼层
  1. void
  2. Block_transpose(int **array,int n){ //分块转置
  3.     int k =2;
  4.      for(int i=0;i<n;i+=k)
  5.         for(int j=0;j<n;j+=k)
  6.           TransposeMatri((int**)((int*)array+i*n+j),k);//子矩阵  
  7. }
复制代码

按道理这样没错
哪里错了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 22:08:08 | 显示全部楼层
万千只cnm 发表于 2021-9-20 21:47
如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵

把你现在的代码贴出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 23:02:52 | 显示全部楼层
万千只cnm 发表于 2021-9-20 21:54
按道理这样没错
哪里错了呢

你是怎么划分4个小矩阵的?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 23:18:49 | 显示全部楼层
人造人 发表于 2021-9-20 22:08
把你现在的代码贴出来
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;

  4. void
  5. TransposeMatri(int **array,int n){//全部转置
  6.     for(int i=0;i<n;i++)
  7.       for(int j=0;j<n;j++){
  8.             if(j>i)//主副三角
  9.               swap(array[i][j],array[j][i]);   
  10.       }
  11. }
  12. void
  13. Block_transpose(int **array,int n){ //分块转置
  14.     int k =2;
  15.      for(int i=0;i<n;i+=k)
  16.        for(int j=0;j<n;j+=k)
  17.           TransposeMatri((int**)((int*)array+i*n+j),k);//这里怎么指向分块的二维数组呢
  18. }
  19. int main(){
  20.     int **a= new int *[4];
  21.      for(int i=0;i<4;i++)
  22.         a[i]=new int [4];
  23.       
  24.          for (int i = 0; i < 4; i++)
  25.          {
  26.                  for (int j = 0; j < 4; j++)
  27.                  {
  28.                          a[i][j]=i*4+j;
  29.                  }
  30.          }
  31.           for(int i=0;i<4;i++){
  32.              for(int j=0;j<4;j++)
  33.              cout<<a[i][j]<<' ';
  34.           cout<<endl;
  35.        }
  36.        Block_transpose(a,4);
  37.         cout<<"---------------------"<<endl;
  38.         for(int i=0;i<4;i++)
  39.              for(int j=0;j<4;j++)
  40.              cout<<a[i][j]<<' ';
  41.           cout<<endl;
  42.        return 0;
  43. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 23:19:40 | 显示全部楼层
jhq999 发表于 2021-9-20 23:02
你是怎么划分4个小矩阵的?

4个元素为一组啊  4个田不就是4个小矩阵
1 2 5 6 就是一个子矩阵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 23:47:00 | 显示全部楼层

我不明白,转换之前是这个样子

1.png

转换之后是什么样子的?这样?

2.png


其实就是最初的问题,你一直没说

3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 00:30:39 | 显示全部楼层
人造人 发表于 2021-9-20 23:47
我不明白,转换之前是这个样子

主对角线对称呀  行列 变列行
1 2
3 4
2坐标是(1,2)的话 变成(2,1)  3是(2,1)变(1,2)
对称的元素互换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 06:53:31 | 显示全部楼层
万千只cnm 发表于 2021-9-21 00:30
主对角线对称呀  行列 变列行
1 2
3 4

4X44里第2个2X2和第3个2X2得整体对换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 06:58:59 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-21 07:34 编辑

这个流程,而且成员越多,小矩阵互换越多
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表