Как проверить, близка ли матрица к единичной матрице? - PullRequest
0 голосов
/ 28 апреля 2020

Я хотел знать, существует ли скалярная мера того, насколько близка матрица вращения к единичной матрице тех же размеров? Если нет, то кто-нибудь может предложить обходной путь?

Я занимаюсь оптимизацией с использованием алгоритма geneti c и более желательны ротационные матрицы, близкие к единичным матрицам. Вот почему мне нужна эта мера для включения в фитнес-функцию.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

в случае матрицы вращения (не однородной), если матрица идентична, то:

  1. abs значение каждой строки и столбца равно 1.0
  2. точка между любыми двумя строками равна 0.0
  3. точка между любыми двумя строками равна 0.0
  4. нет двух строк равны
  5. никакие два столбца не равны

, поэтому просто проверьте все строки или столбцы с некоторым порогом. Для «близко к» вы могли бы построить счет. Например, что-то вроде этого:

m[n][m]; // your n x m matrix
score=0.0; // score
for (i=0;i<n;i++) // abs value of rows
  {
  a=0.0;
  for (j=0;j<m;j++ ) a += m[i][j]*m[i][j];
  score+=abs(1.0-sqrt(a))/n;
  }
for (i=0;i<n;i++) // dot between rows
 for (j=i+1;j<n;j++)
  {
  a=0.0;
  for (k=0;k<m;k++ ) a += m[i][k]*m[j][k];
  score+=abs(a)/(n*n);
  }

Теперь score должно содержать некоторое значение. чем ближе к нулю, тем ближе к тождеству матрица. чем больше значение, тем менее близко к идентичности. Итак:

if (score<threshold) matrix_is_identity;

где порог - это какое-то небольшое значение, такое как 1e-3, в зависимости от того, что вы считаете «близким» к идентичности. Я построил пример оценки, поэтому он должен быть инвариантным по размеру матрицы. Вы можете добавить весовые коэффициенты между размерами и точечными произведениями или добавить собственные тесты ... Первая часть оценки показывает, насколько далеко ваши базисные векторы от размера единицы, а вторая часть определяет перпендикулярность ваших базисных векторов.

В в некоторых случаях лучше набрать max вместо +=, например:

score = max(score,a);

вместо:

score+= a/n;

или:

score+= a/(n*n);

зависит от поведения, которое вы хотите ...

0 голосов
/ 28 апреля 2020

Довольно простым является

d(S,T) = sqrt( Trace( (S-R)'*(S-R)))

Это метри c в математическом смысле, ie

d(S,T) >= 0, and d(S,T) = 0 iff S==T
d(S,T) = d(T,S)
d(S,T) <= d(S,U) + d(U,T)

, более того, он инвариантен при умножении, ie

d( U*S, U*T) = d( S*U, S*T) = d( S, T)

В приведенном выше каждом из S, T, U являются ортогональными матрицами

...