分块矩阵转置
怎么指向 分块的二维数组#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 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的值能一样吗?
看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码
本帖最后由 jhq999 于 2021-9-20 18:10 编辑
TransposeMatri(&(array+j),k);
(array+j)是值不是变量怎么可能有指针
和
&(5+6);一样
你可以
int *tmp=array+j;
TransposeMatri(&(tmp),k);
哦哦 解决了。。
TransposeMatri((int**)((int*)array+i*k+j),k); 人造人 发表于 2021-9-20 17:14
看不懂你的代码,你期望的输出是什么样的?
还有尽可能的解释一下你的思路,代码
就是一个矩阵(n*n)要转置
然后分成小的k*k分别转置,这样大矩阵就转职了
比如 4*4 分成4个2*2 万千只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);
}
}
不能理解不说明行和列,怎么可能用二维数组表达 万千只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 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;
} jhq999 发表于 2021-9-20 18:58
我思路错了 分成小块的话。。主对角线也会对换
for(int i=0;i<n-k;i+=k)
for(int j=0;j<n;j+=k) 人造人 发表于 2021-9-20 18:45
也就是说,如果是 8x8,那就先分成 4x4,然后再分成 2x2,是这样吧?
这个程序输出是什么?这样?
如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵
但我现在如果分成子矩阵,主对角线也会调换。。。 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:} 万千只cnm 发表于 2021-9-20 21:47
如果是8*8
k是自己指定的 k=2 就是16个子矩阵
k=4 就是 4个子矩阵
把你现在的代码贴出来
万千只cnm 发表于 2021-9-20 21:54
按道理这样没错
哪里错了呢
你是怎么划分4个小矩阵的? 人造人 发表于 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;
} jhq999 发表于 2021-9-20 23:02
你是怎么划分4个小矩阵的?
4个元素为一组啊4个田不就是4个小矩阵
1 2 5 6 就是一个子矩阵 万千只cnm 发表于 2021-9-20 23:18
我不明白,转换之前是这个样子
转换之后是什么样子的?这样?
其实就是最初的问题,你一直没说
人造人 发表于 2021-9-20 23:47
我不明白,转换之前是这个样子
主对角线对称呀行列 变列行
1 2
3 4
2坐标是(1,2)的话 变成(2,1)3是(2,1)变(1,2)
对称的元素互换 万千只cnm 发表于 2021-9-21 00:30
主对角线对称呀行列 变列行
1 2
3 4
4X44里第2个2X2和第3个2X2得整体对换 本帖最后由 jhq999 于 2021-9-21 07:34 编辑
这个流程,而且成员越多,小矩阵互换越多
页:
[1]
2