如果允许主对角线为1,则无论v有多大,此矩阵始终会有两个唯一的行v和1-v。由于矩阵是对称的,因此它也具有两个类似的唯一列。这使得构建此矩阵变得微不足道。
## example `v`
set.seed(0)
v <- sample.int(2, 10, replace = TRUE) - 1L
#[1] 1 0 0 1 1 0 1 1 1 1
## column expansion from unique columns
cbind(v, 1 - v, deparse.level = 0L)[, 2 - v]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 0 0 1 1 0 1 1 1 1
# [2,] 0 1 1 0 0 1 0 0 0 0
# [3,] 0 1 1 0 0 1 0 0 0 0
# [4,] 1 0 0 1 1 0 1 1 1 1
# [5,] 1 0 0 1 1 0 1 1 1 1
# [6,] 0 1 1 0 0 1 0 0 0 0
# [7,] 1 0 0 1 1 0 1 1 1 1
# [8,] 1 0 0 1 1 0 1 1 1 1
# [9,] 1 0 0 1 1 0 1 1 1 1
#[10,] 1 0 0 1 1 0 1 1 1 1
这个矩阵的目的是什么?
如果有 n0 个零和 n1 个一,那么该矩阵的维度将为 (n0 + n1) x (n0 + n1),但矩阵中只有 (n0 x n0 + n1 x n1) 个一。因此,对于长向量 v,该矩阵是稀疏的。事实上,它具有超级稀疏性,因为它具有大量重复的行/列。
显然,如果要存储该矩阵中 1 的位置,您可以根本不需要形成该矩阵。