首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历矩阵的diagonal+1

遍历矩阵的diagonal+1
EN

Stack Overflow用户
提问于 2013-03-28 09:18:36
回答 3查看 1.6K关注 0票数 3

我需要遍历diagonal+1 (即对角线右侧的values 1列),并将值写入dataframe中的列:

代码语言:javascript
运行
复制
write.csv(data.frame(matrix[1,2], matrix[2,3], matrix[3,4])

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-28 09:28:26

您可以使用矩阵进行索引。

例如

代码语言:javascript
运行
复制
m <- matrix(1:25, ncol = 5)

可以使用以下命令访问非对角线

代码语言:javascript
运行
复制
offd <- cbind(1:4,2:5)


m[offd]

## [1]  6 12 18 24

您可以创建一个执行此操作的函数

代码语言:javascript
运行
复制
offdiag <- function(m, offset){
  i <- seq_len(nrow(m)-offset)
  j <- i + offset
  m[cbind(i,j)]

}


offdiag(m, 1)
## [1]  6 12 18 24
offdiag(m, 2)
[1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
票数 7
EN

Stack Overflow用户

发布于 2013-03-28 10:07:52

一种快速的方法是使用经常被忽视的row()col()函数,而不是通过编程来计算索引。对于矩阵中的每个元素,它们分别返回该元素所属的行或列。

对角线是元素的行索引等于列索引的位置。第一条次对角线表示行索引等于列索引加1,而第一条上对角线表示行索引等于列索引减1。

下面是一些示例:

代码语言:javascript
运行
复制
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

对角线

代码语言:javascript
运行
复制
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

第一次对角线

代码语言:javascript
运行
复制
m[row(m) == col(m) + 1

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

第一超对角线

代码语言:javascript
运行
复制
m[row(m) == col(m) -1]

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

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

创建数据框并写出

从本质上讲,你已经有了这个,但是

代码语言:javascript
运行
复制
write.csv(data.frame(m[row(m) == col(m) + 1), file = "subdiag.csv")

次对角线或超对角线的一般函数

代码语言:javascript
运行
复制
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)] 
}

在使用中,我们有:

代码语言:javascript
运行
复制
> diags(m)
[1]  2  8 14 20
> diags(m, type = "super")
[1]  6 12 18 24
> diags(m, offset = 2)
[1]  3  9 15
票数 9
EN

Stack Overflow用户

发布于 2013-03-28 09:52:51

取一个子矩阵,然后是它的对角线。

使用mnel的m

代码语言:javascript
运行
复制
diag(m[, -1])
[1]  6 12 18 24

作为一个具有可变偏移量的函数(但在这种形式下,它并不比mnel的解决方案更干净):

代码语言:javascript
运行
复制
offdiag <- function(m, offset) {
  s <- seq(offset)
  diag(m[,-s, drop=FALSE])
}

offdiag(m, 1)
## [1]  6 12 18 24
offdiag(m, 2)
## [1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15672585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档