2011-10-02 75 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);