Я вижу несколько похожих вопросов:
Заданные элементы:
elems = [1,2,3,4] # dimensions 1x4
Если у меня есть вектор:
M = [4,2,3,1] # dimensions 1x4
Я знаю, что есть некоторая матрица перестановок p
, которую я могу умножить elems * p = M
, которая в этом случае будет:
p =
[
0 0 0 1
0 1 0 0
0 0 1 0
1 0 0 0
] # dimensions 4x4
# eg:
# elems * P = M
1x4 4x4 = 1x4
Теперь, на мой вопрос, меня интересует, как бы это выглядело в случае, когда M - нековершинная, неквадратная матрица, например:
M' = [
4 2 3 1
4 3 2 1
1 2 3 4
] # dimensions 3x4
Для того же
elems' = [
1 2 3 4
1 2 3 4
1 2 3 4
] # where this is now tripled to be conformant dimensions
# dimensions 3x4
#
# meaning P is still 4x4
Вы можете видеть M_prime
и elems_prime
в этом случае все еще только перестановки, но теперь многовариантные, а не просто один вектор, как первоначально.
Я знаю, что не могу просто сделать следующий вид вещей, потому что матрица не является квадратной и, следовательно, не обратимой:
elems' * P = M'
P = elems'^-1 * M'
# eg:
# elems' * P = M'
3x4 4x4 = 3x4
Когда я пытаюсь, по крайней мере в R, я вижу:
> P <- ginv(elems_prime) %*% M_prime
[,1] [,2] [,3] [,4]
[1,] 0.1 0.07777778 0.08888889 0.06666667
[2,] 0.2 0.15555556 0.17777778 0.13333333
[3,] 0.3 0.23333333 0.26666667 0.20000000
[4,] 0.4 0.31111111 0.35555556 0.26666667
Это возвращает мне M '?
> elems_prime %*% P
[,1] [,2] [,3] [,4]
[1,] 3 2.333333 2.666667 2
[2,] 3 2.333333 2.666667 2
[3,] 3 2.333333 2.666667 2
!= M' # No, does not.
Так что это не правильно.
Мои вопросы:
- Чтоправильный P, который будет правильно переставлять матрицу элементов в матрицу M?
- Как называется алгоритм его поиска?(реализация в R, Haskell или псевдокоде хороша)
- Есть ли способ ограничить значения P целыми числами, предпочтительно 0 или 1?
для воспроизводимости R
> dput(elems_prime)
structure(c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), .Dim = 3:4)
> dput(M_prime)
structure(c(4, 4, 1, 2, 3, 2, 3, 2, 3, 1, 1, 4), .Dim = 3:4)