鱼C论坛

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

[已解决]分块矩阵转置

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

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

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

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

void 
TransposeMatri(int **array,int n){//全部转置
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
            if(j>i)//主副三角
              swap(array[i][j],array[j][i]);   
      }
}
void
Block_transpose(int **array,int n){ //分块转置
    int k =2;
     for(int i=0;i<n;i+=k)
       for(int j=0;j<n;j+=k)
          TransposeMatri(&(array[i]+j),k);//这里怎么指向分块的二维数组呢
}
int main(){
    int **a= new int *[2];
     for(int i=0;i<2;i++)
        a[i]=new int [2];
        a[0][0]=1; a[0][1]=2;a[1][0]=3;a[1][1]=4;

      Block_transpose(a,2);

       for(int i=0;i<2;i++){
             for(int j=0;j<2;j++)
             cout<<a[i][j]<<' ';
          cout<<endl;
       }
       
     
    return 0;
}
这个会报错
 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 编辑
TransposeMatri(int **array,int n){//全部转置
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
            if(j>i)//主副三角
              swap(array[i][j],array[j][i]);   
      }
}
计算机能明白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 编辑
 TransposeMatri(&(array[i]+j),k);
(array[i]+j)是值不是变量怎么可能有指针
和
&(5+6);一样
你可以
int *tmp=array[i]+j;
TransposeMatri(&(tmp),k);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 18:25:01 | 显示全部楼层
哦哦 解决了。。
 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
TransposeMatri(int **array,int n){//全部转置
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
            if(j>i)//主副三角
              swap(array[i][j],array[j][i]);   
      }
}
不能理解不说明行和列,怎么可能用二维数组表达
想知道小甲鱼最近在做啥?请访问 -> 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 3
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

void 
TransposeMatri(int **array,int n){//全部转置
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
            if(j>i)//主副三角
              swap(array[i][j],array[j][i]);   
      }
}
void
Block_transpose(int **array,int n){ //分块转置///////////////////////////////////////////////////这个函数没有用
    int k =4;\\\\\\\\\\\\k=2出错
     for(int i=0;i<n;i+=k)
       for(int j=0;j<n;j+=k)
           TransposeMatri((int**)((int*)array+i*k+j),k);//这里怎么指向分块的二维数组呢
}
int main(){
    int **a= new int *[4];
     for(int i=0;i<4;i++)
        a[i]=new int [4];
       
         for (int i = 0; i < 4; i++)
         {
                 for (int j = 0; j < 4; j++)
                 {
                         a[i][j]=i*4+j;
                 }
         }
          for(int i=0;i<4;i++){
             for(int j=0;j<4;j++)
             cout<<a[i][j]<<' ';
          cout<<endl;
       }
      //Block_transpose(a,4);/////////这个函数没有用
      TransposeMatri (a,4);
       for(int i=0;i<4;i++){
             for(int j=0;j<4;j++)
             cout<<a[i][j]<<' ';
          cout<<endl;
       }
       
     
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
void
Block_transpose(int **array,int n){ //分块转置
    int k =2;
     for(int i=0;i<n;i+=k)
        for(int j=0;j<n;j+=k)
          TransposeMatri((int**)((int*)array+i*n+j),k);//子矩阵  
}
按道理这样没错
哪里错了呢
想知道小甲鱼最近在做啥?请访问 -> 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
把你现在的代码贴出来
#include<iostream>
#include<algorithm>
using namespace std;

void 
TransposeMatri(int **array,int n){//全部转置
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
            if(j>i)//主副三角
              swap(array[i][j],array[j][i]);   
      }
}
void
Block_transpose(int **array,int n){ //分块转置
    int k =2;
     for(int i=0;i<n;i+=k)
       for(int j=0;j<n;j+=k)
          TransposeMatri((int**)((int*)array+i*n+j),k);//这里怎么指向分块的二维数组呢
}
int main(){
    int **a= new int *[4];
     for(int i=0;i<4;i++)
        a[i]=new int [4];
      
         for (int i = 0; i < 4; i++)
         {
                 for (int j = 0; j < 4; j++)
                 {
                         a[i][j]=i*4+j;
                 }
         }
          for(int i=0;i<4;i++){
             for(int j=0;j<4;j++)
             cout<<a[i][j]<<' ';
          cout<<endl;
       }
       Block_transpose(a,4);
        cout<<"---------------------"<<endl;
        for(int i=0;i<4;i++)
             for(int j=0;j<4;j++)
             cout<<a[i][j]<<' ';
          cout<<endl;
       return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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-11-15 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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