万千只cnm 发表于 2021-9-20 16:42:52

分块矩阵转置

怎么指向 分块的二维数组
#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,array);   
      }
}
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+j),k);//这里怎么指向分块的二维数组呢
}
int main(){
    int **a= new int *;
   for(int i=0;i<2;i++)
      a=new int ;
      a=1; a=2;a=3;a=4;

      Block_transpose(a,2);

       for(int i=0;i<2;i++){
             for(int j=0;j<2;j++)
             cout<<a<<' ';
          cout<<endl;
       }
      
   
    return 0;
}
这个会报错
TransposeMatri(&(array+j),k);

咋解决呀 或者思路错了吗

jhq999 发表于 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,array);   
      }
}
计算机能明白array二维数组的行和列各为多少吗?
array里的array和array里的array的值能一样吗?

人造人 发表于 2021-9-20 17:14:28

看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码

jhq999 发表于 2021-9-20 17:38:57

本帖最后由 jhq999 于 2021-9-20 18:10 编辑


TransposeMatri(&(array+j),k);
(array+j)是值不是变量怎么可能有指针

&(5+6);一样
你可以
int *tmp=array+j;
TransposeMatri(&(tmp),k);

万千只cnm 发表于 2021-9-20 18:25:01

哦哦 解决了。。
TransposeMatri((int**)((int*)array+i*k+j),k);

万千只cnm 发表于 2021-9-20 18:29:01

人造人 发表于 2021-9-20 17:14
看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码

就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2

jhq999 发表于 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,array);   
      }
}
不能理解不说明行和列,怎么可能用二维数组表达

人造人 发表于 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

jhq999 发表于 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,array);   
      }
}
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 *;
   for(int i=0;i<4;i++)
      a=new int ;
      
       for (int i = 0; i < 4; i++)
       {
               for (int j = 0; j < 4; j++)
               {
                       a=i*4+j;
               }
       }
          for(int i=0;i<4;i++){
             for(int j=0;j<4;j++)
             cout<<a<<' ';
          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<<' ';
          cout<<endl;
       }
      
   
    return 0;
}

万千只cnm 发表于 2021-9-20 21:45:19

jhq999 发表于 2021-9-20 18:58


我思路错了 分成小块的话。。主对角线也会对换
for(int i=0;i<n-k;i+=k)
       for(int j=0;j<n;j+=k)

万千只cnm 发表于 2021-9-20 21:47:56

人造人 发表于 2021-9-20 18:45
也就是说,如果是 8x8,那就先分成 4x4,然后再分成 2x2,是这样吧?
这个程序输出是什么?这样?

如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵
但我现在如果分成子矩阵,主对角线也会调换。。。

万千只cnm 发表于 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);//子矩阵
}
按道理这样没错
哪里错了呢{:5_104:}

人造人 发表于 2021-9-20 22:08:08

万千只cnm 发表于 2021-9-20 21:47
如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵


把你现在的代码贴出来

jhq999 发表于 2021-9-20 23:02:52

万千只cnm 发表于 2021-9-20 21:54
按道理这样没错
哪里错了呢

你是怎么划分4个小矩阵的?

万千只cnm 发表于 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,array);   
      }
}
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 *;
   for(int i=0;i<4;i++)
      a=new int ;
      
         for (int i = 0; i < 4; i++)
         {
               for (int j = 0; j < 4; j++)
               {
                         a=i*4+j;
               }
         }
          for(int i=0;i<4;i++){
             for(int j=0;j<4;j++)
             cout<<a<<' ';
          cout<<endl;
       }
       Block_transpose(a,4);
      cout<<"---------------------"<<endl;
      for(int i=0;i<4;i++)
             for(int j=0;j<4;j++)
             cout<<a<<' ';
          cout<<endl;
       return 0;
}

万千只cnm 发表于 2021-9-20 23:19:40

jhq999 发表于 2021-9-20 23:02
你是怎么划分4个小矩阵的?

4个元素为一组啊4个田不就是4个小矩阵
1 2 5 6 就是一个子矩阵

人造人 发表于 2021-9-20 23:47:00

万千只cnm 发表于 2021-9-20 23:18


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



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




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


万千只cnm 发表于 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)
对称的元素互换

jhq999 发表于 2021-9-21 06:53:31

万千只cnm 发表于 2021-9-21 00:30
主对角线对称呀行列 变列行
1 2
3 4


4X44里第2个2X2和第3个2X2得整体对换

jhq999 发表于 2021-9-21 06:58:59

本帖最后由 jhq999 于 2021-9-21 07:34 编辑

这个流程,而且成员越多,小矩阵互换越多
页: [1] 2
查看完整版本: 分块矩阵转置