2011-10-02 64 views
8

所以我有一个N维数组,其中N是一个完美的正方形。我把这个一维数组想象成一个二维数组(尽管它不是)。例如,具有值int Array = { 0,1,2,3,4,5,6,7,8 }移调1维阵列

阵列即

int *Array = new int [9];                                                  
for (int i = 0 ; i < 9 ; i ++) 
     Array[i] = i; // For example 

这被打印为

0 1 2 
3 4 5 
6 7 8 

所以,我要互换的一个维阵列,使得我得到的位置转吧,...

例如...

0 3 6 
1 4 7 
2 5 8 

这是基本相同的一个维数组,但值进行交换,从而数组现在int Array = {0,3,6,1,4,7,2,5,8}

如果我把它扩展到尺寸1024 * 1024的数组,怎么会逻辑是什么?

回答

18

随着n = sqrt(N),你可以只尝试像一些简单:

for(int i = 0; i < n; ++i) 
    for(int j = i+1; j < n; ++j) 
     std::swap(Array[n*i + j], Array[n*j + i]); 
+0

哈哈。这是一个超快速的答案;) – Legolas

+0

你的阵列是一个一维阵列? – 2016-01-19 20:07:05

8

转置操作执行swap(v[y][x],v[x][y])排除对角矩阵的上部或下部三角形,(比方说上)。

在C一维向量vcv[y][x]对应于vc[y*n+x]。 所以你想要做vc[y*n+x] = vc[x*n+y]

你想要交换的元素是那些为x > y

你最终做:

for(int y = 0; y < n; ++y) 
    for(int x = y+1; x < n; ++x) 
     swap(vc[x*n + y], vc[y*n + x]); 

可以使用这个自己想通......

+0

是的。感谢您的快速回答! ;) – Legolas

0

,而无需使用交换功能。 len是数组的长度。

int i,j; 
    N = sqrt(len);  
    int temp[len]; 
    for(i=0;i<N;i++) 
    { for(j=0;j<N;j++) 
     { 
      temp[j+(i*N)] = a[(j*N)+i]; 
     } 
    } 
1
#include <iostream> 
#include <cmath> 

using namespace std; 

int xyToIndex(const int x, const int y, const int size){ 
    return x + y * size; 
} 

int main(){ 
    int a[] = { 0,1,2,3,4,5,6,7,8 }; 

    const int size = sqrt(sizeof(a)/sizeof(int)); 

    //print only 
    for(int x = 0;x < size; ++x){ 
     for(int y = 0; y < size; ++y) 
      cout << a[xyToIndex(x,y,size)] << " ";; 
     cout << endl; 
    } 
    //make array 
    int b[size*size]; 
    int index = 0; 
    for(int x = 0;x < size; ++x) 
     for(int y = 0; y < size; ++y) 
      b[index++] = a[xyToIndex(x,y,size)]; 

    for(int i = 0; i< size * size ; ++i){ 
     cout << b[i] << " "; 
    } 
} 
1

您可以交换值矩阵或交换的解释在后来的功能。

例如,您可以打印(j,I)而不是打印(i,j)并打印转换姿势。

这就是说,你想做什么exaclty?如果你看看LAPACK和BLAS,他们的例程会采用标志来控制算法来正常解释它们或者作为转置。

0
static unsigned other(unsigned dim0, unsigned dim1, unsigned index) 
{ 

#if 0 
unsigned x0,x1; 
x0 = index % dim0 ; 
x1 = index/dim0 ; 

return x0 * dim1 + x1; 

#else 

unsigned mod,val; 

mod = dim0 * dim1 -1; 
val = (index==mod) ? mod: (dim1*index) % mod; 
return val; 
#endif 
} 

上述函数返回索引的“其他”索引(转置矩阵中的一个:= x和y被交换)。 dim0和dim1是矩阵的“水平”和“垂直”大小。 #ifdeffed-out部分是天真的实现。 在你的情况,你可以初始化(或分析)一维数组:

for (i=0; i < 9; i++) 
    arr[i] = other(3, 3, i);