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