LINUX.ORG.RU

Алгоритм «укладывания» векторов в n-мерное пространство

 ,


0

3

Всем привет!

Положим, у нас есть симметричная матрица размера NxN скалярных произведений единичных векторов друг на друга A_ij=(a_i, a_j). Хочется определить сколько из всех этих векторов линейно независимы и уложить их в пространство наименьшей возможной размерности. В принципе, алгоритм этот довольно просто составляется, но хотелось бы знать, есть ли уже реализации его в какой-нибудь из библиотек(С/С++)?

Вроде бы алгоритм такой:

1) берем любой вектор, говорим, что первая ось направлена вдоль него. соответственно, его координаты (1,0,...,0). У всех остальных векторов сразу известны проекции на эту ось A_1j.

2) проекция второго вектора на вторую ось: sqrt(1-A_12^2)

3) проекции остальных векторов на соответствующие оси получаются из решения простой линейной системы уравнений.

На выходе получаем квадратную нижнетреугольную матрицу координат векторов (с точностью до поворотов СК).

★★

Последнее исправление: aido (всего исправлений: 1)

Алгоритм - Гаусс.

Просто приводишь матрицу по возможности к треугольному виду, ненулевые строчки/столбцы и будут базисом того пространства.

только матрицу A бери не из скалярных произведений, а просто составь построчно из тех самых векторов.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Так мне бы еще возможные координаты векторов получить с точностью до поворота.

aido ★★
() автор топика
Ответ на: комментарий от dikiy


только с нюансом одним, если получится полностью нулевая стрка, то ее надо будет переиндексирвоать, чтобы она как бы «внизу» была. И переиндексацию запомнить А потом когда диагональную матрицу получишь - соответственно индексам получишь базисные вектора.

Сумбурно я как-то объяснил...

Если хочешь быстро, то кури Shur decomposition.

dikiy ★★☆☆☆
()
Ответ на: комментарий от aido

gsl же.

Но вообще проще это руками сделать. Симметричный Гаусс не сложен. Хотя если нужна точность и скорость, то лучше GSL есессно. Или LAPACK.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Так стоп, какой нафиг Гаусс или Schur decomposition, если надо из скалярных произведений получить координаты? как минимум, там по диагонали будут корни стоять, а это уже нелинейная операция.

aido ★★
() автор топика
Ответ на: комментарий от aido

Так стоп, какой нафиг Гаусс или Schur decomposition, если надо из скалярных произведений получить координаты?

такой, что

A=S' D S, где S' - это транспонированная матрица. Можешь D не трогать, и не будет корней. Те строчки матрицы S, которые соответствуют ненулевым столбцам D и будут базисом пространства.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

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

aido ★★
() автор топика
Ответ на: комментарий от aido

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

Это в том числе и формула, да. Это решает задаче нахождения ортонормального базиса. Цимес в том, что D - диагональна.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Это решает задачу нахождения ортонормального базиса

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

aido ★★
() автор топика
Ответ на: комментарий от aido

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

так получишь же! с помощью разложения.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

значит, надо покурить линал....

aido ★★
() автор топика
Ответ на: комментарий от aido
octave:27> a=[1 0 1; 2 2 0; 3 2 1; 3 4 -1]
a =

   1   0   1
   2   2   0
   3   2   1
   3   4  -1

octave:28> rank(a)
ans =  2
octave:29> g=a*a'
g =

    2    2    4    2
    2    8   10   14
    4   10   14   16
    2   14   16   26

octave:30> [s d]=eig(g)
s =

   0.781361  -0.191139   0.585448   0.100952
  -0.285966  -0.861251   0.028202   0.419136
  -0.425585   0.414510   0.613650   0.520089
   0.355775   0.223371  -0.529044   0.737320

d =

Diagonal Matrix

  -1.7706e-15            0            0            0
            0  -2.2017e-16            0            0
            0            0   4.4817e+00            0
            0            0            0   4.5518e+01

octave:33> usys=s(:,3:4)
usys =

   0.585448   0.100952
   0.028202   0.419136
   0.613650   0.520089
  -0.529044   0.737320
octave:34> l=usys\a
l =

   0.89567  -0.83247   1.72814
   4.71145   4.82773  -0.11628

octave:35> a-usys*l
ans =

  -4.4409e-16   4.6455e-16  -1.1102e-15
   4.4409e-16   8.8818e-16  -1.5787e-16
   4.4409e-16   6.6613e-16   3.3307e-16
  -8.8818e-16   0.0000e+00   0.0000e+00

octave:36> 

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Судя по size(g) (g=исходная А у ТС), в a имеется 4 вектора в 3-х-мерии. usys = 2 вектора в 4-х-мерии, предлагаются в качестве базиса плоскости в 3-х-мерии??

(своего мнения нет - не помню - для надёжной консультации)

abvgdee
()
Ответ на: комментарий от dikiy

И мне любопытно, почему стандартный базис 2-мерия ((1,0),(0,1)) не подходит в качестве ответа (для этих численных данных) на исходный вопрос? Мы всегда можем исходные 4 вектора (да, которые не заданы) повернуть в плоскость xy (т.к. rank(a)=2), а исходную матрицу Грама g (g=исходная А у ТС) этот поворот не изменит.

abvgdee
()
Ответ на: комментарий от abvgdee

Вот и требуется вычислить, как xy в четырех мерном пространстве лежит

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

По size g мы судим о размерности пространства породившего грамовскую матрицу.

«когда вы говорите, такое ощущение что вы бредите» (C) кино-классика

У тебя size(a)=[4,3], и a*a' даёт скалярное произведение четырёх 3-хмерных векторов. Поэтому size(g) показывает число исходных векторов! А «о размерности пространства породившего грамовскую матрицу» можно судить по числу ненулевых элементов в d, или рангу (заранее неизвестной) a.

abvgdee
()
Ответ на: комментарий от abvgdee

Да, чето немного не то 😃 Но алгоритм не поменяется, просто а надо задать 4*4, иначе нифига не пределить векторов должно быть столько же, какая размерность.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Хорошо что прогресс. «Последняя строчка» a-usys*l=0 показывает что столбцы a являются линейными комбинациями (двух) столбцов usys. Только вот векторы исходные у тебя - по строкам a! Поэтому что именно алгоритм делает - тот ещё вопрос..

abvgdee
()
Ответ на: комментарий от dikiy

Вспомнил вроде.. Не то алгоритм делает.

g=a*a' - неудачное запутывающее (намекает на Грама) обозначение. Компоненты векторов - в столбцах a, обозначу тут эту (незаданную) матрицу А.

А*А' - мы нарочно берём такое необычное скалярное произведение. EVD=eigen-value-decomposition от него действительно даст базис range(A) (см. учебники: EVD,SVD). В этом смысле «алгоритм» (из 1 шага EVD) - верен, столбцы usys будут базисом. Для любой размерности - никаких проблем нет (этим постом я запутал dikiy его же путаницей). Проблема в том что эта матрица (А*А') нам не задана - облом.

EVD от обычного (настоящего) скал.произв. А'*А, т.е. от матрицы Грама (которая нам и задана) даст нам базис ортог.дополнения ядра (как это по-человечески? т.е. откуда отображение А реально отображает). По нему базис range(A) никак без А не построить - опять облом.

Вобщем, кмк ответ на задачу - смешной - стандартный базис размерности ранга матр. Грама :)

abvgdee
()
Ответ на: комментарий от abvgdee

Вобщем, кмк ответ на задачу - смешной - стандартный базис размерности ранга матр. Грама :)

да нифига подобного. Диагонализировать надо для начала.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Диагонализировать хорошо бы незаданную A, с SVD: A=U*Sigma*V'. (здесь U будет той же самой что и U из EVD(A*A'), с точностью до перестановок и знаков столбцов). U даст ортонормированный базис range(A). Поскольку Грам - единственное что задано, и он не изменится при U, этот базис (который можно принять стандартным), и будет ответом.

А с одним лишь Грамом - вообще говоря - ты ничего не сделаешь (кмк - я не эксперт). В каких-нибудь частных случаях может что-то и выудишь из него..

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

abvgdee
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.