r - 循环遍历矩阵的对角线+1

标签 r matrix

我需要遍历对角线 + 1(即对角线右侧的值 1 列)并将值写入数据框中的列:

write.csv(data.frame(matrix[1,2], matrix[2,3], matrix[3,4])

我如何使用函数来做到这一点,而不仅仅是列出值的所有位置?

最佳答案

这样做的一个快速方法是使用经常被忽视的 row()col()职能。这些为矩阵的每个元素分别返回该元素所属的行或列。

对角线是元素的行索引等于列索引的位置。第一个子对角线是行索引等于列索引加 1,而第一个超对角线是行索引等于列索引减 1。

这里有些例子:

m <- matrix(1:25, ncol = 5)
m

> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25

对角线
m[row(m) == col(m)]
diag(m)

> m[row(m) == col(m)]
[1]  1  7 13 19 25
> diag(m) ## just to show this is correct
[1]  1  7 13 19 25

第一次对角线
m[row(m) == col(m) + 1

> m[row(m) == col(m) + 1]
[1]  2  8 14 20

第一条超对角线
m[row(m) == col(m) -1]

> m[row(m) == col(m) -1]
[1]  6 12 18 24

可以通过增加添加到列索引的值来提取高阶超对角线和次对角线。

创建数据框并写出

基本上你已经有了这个,但是
write.csv(data.frame(m[row(m) == col(m) + 1), file = "subdiag.csv")

次对角线或超对角线的一般函数
diags <- function(m, type = c("sub", "super"), offset = 1) {
  type <- match.arg(type)
  FUN <-
  if(isTRUE(all.equal(type, "sub")))
    `+`
  else
    `-`
  m[row(m) == FUN(col(m), offset)] 
}

在使用中,我们有:
> diags(m)
[1]  2  8 14 20
> diags(m, type = "super")
[1]  6 12 18 24
> diags(m, offset = 2)
[1]  3  9 15

关于r - 循环遍历矩阵的对角线+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672585/

相关文章:

r - 将一堆函数应用于 R 中矩阵的列

r - 为什么 R 将数字数据作为字符读取?

r - 检查传递的参数是否存在

r - 如何拆分值的数据帧并在 block 上使用 rle?

python - 尝试使用 python 将矩阵放入集合中,但它仍然允许重复

java - 有没有办法移动二维数组矩阵中的列?

R可视化: sensible repel points on map (beeswarm?)

r - 什么是回调机制以及它如何在 R 中应用

python - 使用 Python 编写具有 p 值的 Seaborn 相关矩阵

r - 将矩阵转换为 R 中定义的三个列