2011-01-26 10 views
11

mam M matryca, o wymiarach NxN, przy czym M (i, j) = M (J, I)elementy odwzorowania 2D górnych trójkąta i dolnej trójkąt strukturze liniowej

że chcieliby reprezentowania struktura jako (N² + N)/2 liniowa tablica K, aby zaoszczędzić miejsce. Mój problem dotyczy formuły, która zamieni M (min (i, j), min (i, j)) na zakres [0, (N^2)/2)

Poniżej znajduje się mapowanie macierzy 3x3 z indeksami k liniowym, X oznacza komórki te nie występują, natomiast ich transpozycji jest stosować:


X456 
XX78 
XXX9 

Tutaj jest macierzą 7x7 indeksami dla liniowego układu K

 0 1 2 3 4 5 6 
0 00 01 02 03 04 05 06 
1  07 08 09 10 11 12 
2  13 14 15 16 17 
3   18 19 20 21 
4    22 23 24 
5     25 26 
6     27 

w tej chwili mam następujące

int main() 
{ 
    const unsigned int N = 10; 
    int M[N][N]; 

    int* M_ = &(M[0][0]); 

    assert(M[i][j] = M_[N * min(i,j) + max(i,j)]); 

    //int* K = ..... 
    //assert(M[i][j] = K[.....]); 

    return 0; 
} 
+0

Liczba elementów w trójkątnej macierzy nie jest N²/2, ale (N² + N)/2. –

Odpowiedz

9

Zakładając, y> = x, można użyć "mapowanie" jak

index := x + (y+1)*y/2 

które produkują

0 

1 2 

3 4 5 

6 7 8 9 

10 11 12 13 14 

Jeśli x> y, po prostu zamiana x i y. Potrzebujesz do tego (size + 1) * size/2 elements space.

+0

Ta formuła jest niepoprawna. Autor poprosił o macierz górnego trójkąta, a nie niżej. –

+0

@ViktorFonic Ostatnie zdanie podaje wzór górnego trójkąta. Przeczytaj "Jeśli x> y" jako "Jeśli potrzebujesz górnego trójkąta". – hirschhornsalz

12

Aby iść w przeciwnym kierunku, który jest to, co potrzebne:

void printxy(int index) 
{ 
    int y = (int)((-1+sqrt(8*index+1))/2); 
    int x = index - y*(y+1)/2; 
} 
+0

Dzięki za to, dokładnie to, czego potrzebowałem. Wydajność była znacznie lepsza na GPU niż to, co wymyśliłem: 'int c = element; int r = 0; while (c - (r + 1)> = 0) {r ++; c - = r; } ' –

-3

Oto prawidłowe odwzorowanie:

 for (int i = 0; i < n; i++) { 
      for (int j = i; j < n; j++) { 
        int idx = sum(n) - sum(n - i) + j - i; 
      } 
     } 

gdzie sum(x) = x * (x + 1)/2;

Powiązane problemy