R 在特定矩阵中排列所有对角向量
我试图找出如何创建一个新的矩阵,所有对角线都按列排列R 在特定矩阵中排列所有对角向量,r,matrix,R,Matrix,我试图找出如何创建一个新的矩阵,所有对角线都按列排列 0 1 2 7 0 0 0 0 0 0 3 6 7 0 0 0 0 0 0 3 1 7 0 0 0 0 0 0 4 4 7 0 0 0 0 0 0 5 8 7 0 0 0 0 0 0 1 8 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 提取我们得到的对角线 1 3 3 4 5 1 4 2 6 1 4 8 8 7 7 7 7 7 现在,我在R中寻找有效的解来排列这些对角向量,这样得到的矩阵是 1 2 7 3
0 1 2 7 0 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0
提取我们得到的对角线
1 3 3 4 5 1 4
2 6 1 4 8 8
7 7 7 7 7
现在,我在R中寻找有效的解来排列这些对角向量,这样得到的矩阵是
1 2 7
3 6 7
3 1 7
4 4 7
5 8 7
1 8 0
4 0 0
0 0 0
同样,要实现反向形式,即最小对角线,首先如下所示
0 0 0
0 0 1
0 2 3
7 6 3
7 1 4
7 4 5
7 8 1
7 8 4
我曾尝试使用for循环,但该解决方案在计算上并不高效,因为矩阵可能很大(10^3)
我觉得有效的解决方案会非常简单,但我无法理解。您可以依次对矩阵进行子集划分并提取对角线元素
sapply(0:2, function(i)
diag(m[-(nrow(m):(nrow(m)-i)), -(1:(1+i))])[1:nrow(m)] )
# [,1] [,2] [,3]
#[1,] 1 2 7
#[2,] 3 6 7
#[3,] 3 1 7
#[4,] 4 4 7
#[5,] 5 8 7
#[6,] 1 8 NA
#[7,] 4 NA NA
#[8,] NA NA NA
或
数据
m = structure(c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
3, 0, 0, 0, 0, 0, 0, 7, 6, 3, 0, 0, 0, 0, 0, 0, 7, 1, 4, 0, 0,
0, 0, 0, 0, 7, 4, 5, 0, 0, 0, 0, 0, 0, 7, 8, 1, 0, 0, 0, 0, 0,
0, 7, 8, 4, 0), .Dim = c(8L, 8L))
我认为最简单的方法是使用
sparseMatrix
格式,其中非零条目在对象中由它们的行(I
)和列(j
)位置以及它们所取的值(x
)定义。由此可以很容易地从对角线中导出列矩阵。这里的for
循环也很快(er),但可能更难推广
资料
排列矩阵
b = 3 # Set width of band
n = nrow(m)
library(Matrix)
sm <- as(m, "TsparseMatrix")
sparseMatrix(i = sm@i+1,
j = sm@j - sm@i,
x = sm@x,
dims = c(nrow(sm),b))
#8 x 3 sparse Matrix of class "dgCMatrix"
#[1,] 1 2 7
#[2,] 3 6 7
#[3,] 3 1 7
#[4,] 4 4 7
#[5,] 5 8 7
#[6,] 1 8 .
#[7,] 4 . .
#[8,] . . .
你是怎么“脱身”的对角线?通过使用此答案选择所有非零对角线,您如何确定哪一条是非零对角线?您能否建议一种更有效或更快的方法,因为它仍然是矩阵元素数的二次方?我们是否可以利用这样一个事实,即大多数情况下,矩阵都是稀疏的,且靠近主元素的非对角线元素比较少对角线密集,提前谢谢!我们还可以在给定的矩阵中获得非零元素的向量,如(1,2,3,7,6,3,7,1,4等等)。@Mkty,对于第二个问题,
哪个(t(m)!=0)
或者哪个(m!=0)
应该起作用。这个答案是v。与答案相似,但由于问题的措辞完全不同而添加。
m = structure(c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
3, 0, 0, 0, 0, 0, 0, 7, 6, 3, 0, 0, 0, 0, 0, 0, 7, 1, 4, 0, 0,
0, 0, 0, 0, 7, 4, 5, 0, 0, 0, 0, 0, 0, 7, 8, 1, 0, 0, 0, 0, 0,
0, 7, 8, 4, 0), .Dim = c(8L, 8L))
b = 3 # Set width of band
n = nrow(m)
library(Matrix)
sm <- as(m, "TsparseMatrix")
sparseMatrix(i = sm@i+1,
j = sm@j - sm@i,
x = sm@x,
dims = c(nrow(sm),b))
#8 x 3 sparse Matrix of class "dgCMatrix"
#[1,] 1 2 7
#[2,] 3 6 7
#[3,] 3 1 7
#[4,] 4 4 7
#[5,] 5 8 7
#[6,] 1 8 .
#[7,] 4 . .
#[8,] . . .
out = matrix(0, n, b)
for(i in 1:b) {
ro = 1:(n-i)
co = (1+i):n
out[ro, i] = m[cbind(ro, co)]
}
out
# [,1] [,2] [,3]
#[1,] 1 2 7
#[2,] 3 6 7
#[3,] 3 1 7
#[4,] 4 4 7
#[5,] 5 8 7
#[6,] 1 8 0
#[7,] 4 0 0
#[8,] 0 0 0