Алгоритм Хачияна(Khachiyan) для построения минимальног(по площади) эллипса вокруг заданного набора точек

Пытаюсь написать программу на C++ вычисляющую минимальный(по площади) эллипс описываемый вокруг заданного множества точек. На stackoverflow был найден псевдокод матлаба реализующий оптимальный алгоритм Хачияна для решения данной проблемы.

Во время переписывания кода на C++ возникла пара проблем, на которые я со своими малыми познаниями линейной алгебры, не смог найти ответы.

Проблема 1 - второе действие в цикле while из данного на стековерфлоу псевдокода:
M = diag(Q' * inv(X) * Q); // Q' - transpose of Q
Для некоторых исходных наборов точек, как например {{1, 2}, {3, 4}, {5, 6}, {7, 8}} получается такая матрица X, для которой не существует обратной, и все последующие вычисления невозможны.
Вопрос: Как это нужно трактовать(все множество точек не должно лежать на одной линии?)?

Проблема 2 - интерпретация итоговой матричной формы записи уравнения эллипса.
Как я понял, итоговый результат представляется в виде двух матриц - матрицы c размерности 2x1 задающей центр искомого эллипса и матрицы A размерности 2x2 представляющей некие коэффициенты из записи уравнения эллипса как кривой второго порядка(?).
Вопрос: Как я могу привести данную матричную форму к каноническому виду(ну или к тому виду, из которой её будет удобнее визуализировать)?
  • Вопрос задан
  • 4022 просмотра
Решения вопроса 1
@Bruyerholz
Проблема 1:

Матрица Q имеет вид:

0e7d2b410505190f583a86fa79cac54f.png

Матрица X имеет вид:

62bba2aab886cfd07d27edd026764bbb.png

С учетом вида матрицы Q матрица X примет вид:

ae9d113792d512926a426b55c44b867e.png

Если все x или y равны нулю, то все точки лежат на одной прямой. Это частный неинтересный случай. Если есть x и y ненулевые, то у нас не будет нулевых строк. Если определитель матрицы X равен нулю, то можно написать (выразить строки через друг друга; более простые случаи очевидны):

e3560ffed3ef129e79db5c5c967055df.png

Тоже самое:

fc68c97d9356c6275eb89761ffd470d1.png

Домножаем первую строку на a, вторую на b, складываем:

e74ca812d7927afe1771e63dadc670c5.png

Такая точка (в пространстве размерности N) единственна, при

7007527611ae8f1b66bd88da8a8008f9.png

Это очевидно для случая N = 2. Нарисуйте круг с квадратом радиуса равным 2 и прямую x + y = 2. Они будут касаться в одной точке. После того как нарисуете, это станет очевидно и для любого N.

Итак, мы доказали, что если определитель X равен нулю, то точки лежат на одной прямой.

Проблема 2:

C сайта матлаба нашел правую часть:

042a8035610538fe10e0a8fec028ed5b.png

Нужно найти собственные значения и собственные вектора единичной длины (они должны быть ортогональны) для матрицы A, после чего используя точку

a3de9c346c757ce38325611ddc541ee4.png

как центр, нужно провести собственный вектор длиной

0b9de1725ff66e07834eba067528c719.png

(лямбда соответствует собственному вектору). Аналагично для другого. Эти вектора будут большой и малой полуосями для нашего эллипса. Дальше по возможностям визуализатора.

Как-то все сумбурно получилось.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы