2012-03-12 12 views
7

pracuję z MxM trójkątnej macierzy, która ma następującą postać:Pierwsze wiersza i kolumny trójkątnej Matrix, biorąc pod uwagę Index

M = [m00 m10 m20 m30 m40] 
    [m11 m21 m31 m41 ] 
    [m22 m32 m42  ] 
    [m33 m43   ] 
    [m44    ] 

Jeśli łatwiej wyobrazić to pod względem indeksów, że będzie wyglądać tak:

M = [0 1 3 6 10] 
    [2 4 7 11 ] 
    [5 8 12 ] 
    [9 13  ] 
    [14  ] 

znam ten sposób indeksowania może wyglądać dziwnie, ale byłoby znacznie łatwiej, gdybym mógł utrzymać system indeksowania, jak to jest w porządku dla tego modułu do pracy z innymi.

Walczę z algorytmem, który pobiera indeks i rozmiar macierzy, która może zwrócić wiersz i kolumnę, w której znajduje się dany indeks. Idealnie byłoby mam 2 funkcje, takie jak te:

int getRow (int index, int size); 
int getCol (int index, int size); 

Więc getRow (7, 5) wróci 3

And getCol (7, 5) wróci 1

mam natknąć tego wątku już, ale nie wydaje się modyfikować rozwiązania biorąc pod uwagę, że pracuję na sposób, w jaki się indeksuję.

algorithm for index numbers of triangular matrix coefficients

+0

Tak, masz rację, dokonam edycji. Mimo to, nadal nie mogę wydawać się przerobić algorytm podany w innym temacie, aby pasował do sposobu indeksowania. – Redek

+0

dlaczego getRow (7, 5) zwróci 3? –

+0

Ponieważ sposób indeksowania, wiersze są przekątnymi (nie poziomymi), więc wiersz 3 to 'm30, m31, m32, m33' – Redek

Odpowiedz

7

New Answer

można znaleźć row i column za pomocą następujących wzorów:

int row = floor(-0.5 + sqrt(0.25 + 2 * index)); 
int triangularNumber = row * (row + 1)/2; 
int column = index - triangularNumber; 

To działa, ponieważ pierwszy element w każdym wierszu jest triangular number (0 , 1, 3, 6, 10, 15, ...). Tak więc największa liczba trójkątna niższa niż index daje nam row. Wtedy column jest po prostu różnicą między index a tą liczbą trójkątną.

Pamiętaj też, że nie potrzebujesz parametru M.


Old Odpowiedź

Ten kod daje zarówno row i column z index.

int triangularNumber = 0; 
int row = 0; 
while (triangularNumber + row < index) { 
    row ++; 
    triangularNumber += row; 
} 
int column = index - triangularNumber; 
+0

Dziękuję bardzo! Wygląda na to, że próbowałem to zrozumieć algebraicznie, co powodowało problemy, ale to rozwiązanie iteracyjne działa równie dobrze. – Redek

+0

@Redek, czy na pewno chcesz zmienić indeksowanie macierzy i znaleźć kolumnę wiersza amd w O (n)? –

+0

@Seed Amiri, byłbym otwarty na bardziej wydajne rozwiązanie bez wątpienia, ale to rozwiązanie działa dobrze i dla systemu, który będę realizował to, maksymalna wielkość tej matrycy będzie tylko kilka tysięcy, które moim zdaniem jest dość nieistotny. W związku z tym na pewno z zadowoleniem przyjmuję inne rozwiązania dla mojej własnej korzyści, a nawet dla innych osób, które borykają się z podobnym problemem, ale nie mogą sobie pozwolić na ograniczenie O (n). – Redek

Powiązane problemy