Howellizing матрица - PullRequest
       3

Howellizing матрица

4 голосов
/ 13 января 2012

Я пытаюсь реализовать алгоритм Howellize матрицы, как описано на странице 5 этого документа (ссылка на документы Google) (ссылка на pdf) .

Мне кажется, большая часть этого достаточно очевидна, но я не уверен насчет строки 16, означает ли >> правильный сдвиг? Если это так, то как это вообще работает? Конечно, это будет означать, что биты отрубаются? Насколько я знаю, на данный момент нет гарантии, что число, на которое оно сдвигается, сдвигается на величину, которая сохраняет информацию.
И если это не означает правильный сдвиг, что означает ?

Если кто-то может сэкономить время, я также хотел бы иметь контрольный пример (я не верю, что смогу его создать, я недостаточно хорошо его понимаю).

Я реализовал это так, это правильно? (У меня нет контрольного примера, так как я могу узнать?)

int j = 0;
for (int i = 0; i < 2 * k + 1; i++)
{
    var R = (from row in rows
                where leading_index(row) == i
                orderby rank(row[i]) ascending
                select row).ToList();
    if (R.Count > 0)
    {
        uint[] r = R[0];
        int p = rank(r[i]);    // rank counts the trailing zeroes
        uint u = r[i] >> p;
        invert(r, u); // multiplies each element of r by the 
                      // multiplicative inverse of u
        for (int s = 1; s < R.Count; s++)
        {
            int t = rank(R[s][i]);
            uint v = R[s][i] >> t;
            if (subtract(R[s], r, v << (t - p)) == 0)
                // subtracts (v<<(t-p)) * r from R[s], 
                // removes if all elements are zero
                rows.Remove(R[s]);
        }
        swap(rows, rows.IndexOf(r), j);
        for (int h = 0; h < j - 1; h++)
        {
            uint d = rows[h][i] >> p;
            subtract(rows[h], r, d);
        }
        if (r[i] != 1)
            // shifted returns r left-shifted by 32-p
            rows.Add(shifted(r, 32 - p));
        j++;
    }
}

1 Ответ

1 голос
/ 15 января 2012

Для теста это может вам помочь (страница № 2).Также попробуйте это .

Я думаю, что вы правы относительно правильного сдвига.Чтобы получить форму Хауэлла, они хотят, чтобы значения, отличные от начального значения в столбце, были меньше начального значения.Сдвиг вправо кажется плодотворным для этого.

строка 16 говорит:

         Pick d so that 0 <= G(h,i) - d * ri < ri

Рассмотрим

         G(h,i) - d * ri = 0
         G(h,i) = d * ri
         G(h,i) = d * (2 ^ p)  ... as the comment on line 8 says, ri = 2^p.
         So d = G(h,i) / (2 ^ p)

Сдвиг вправо G (h, i) на p позиций - самый быстрыйспособ вычисления значения d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...