求矩阵置换矩阵的算法

我看到一些类似的问题:

> Generate permutation matrix from permutation vector
> https://math.stackexchange.com/questions/345166/what-is-the-name-for-a-non-square-permutation-matrix

给定元素:

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)

最佳答案 请注意,M’的列空间的顺序高于elem’的列空间.这意味着不存在从elem’到M’的线性映射,因为线性映射不能增加矩阵的行或列空间(有用的是将其视为基础的变换).

由此得出,由elem’* P生成的任何M’可以具有至多1的等级,仅留下传统的置换矩阵作为P’的候选者.

如果我们看一下从M’回到elem,这是一个完全不同的问题,这种不对称性也值得注意.

点赞