【问题标题】:Insert number above the diagonal in R matrix在 R 矩阵的对角线上方插入数字
【发布时间】:2015-04-23 16:44:08
【问题描述】:

我在 R 中有一个这样的向量:

vec1 <- c(14000,12000,8000)

我正在尝试创建一个矩阵,其中 14000 是我的主对角线,1200 是对角线上方的一个,8000 是对角线上方的两个。

我熟悉在 Python/numpy 中执行此操作,但无法在 R 中解决(或者至少是一种有效的方法)。理想的输出应该是这样的:

14000 12000  8000
    0 14000 12000
    0     0 14000

【问题讨论】:

  • (哑)单行t(sapply(1:3, function(x) c(rep(0, x - 1), head(vec1, 4 - x))))

标签: r diagonal


【解决方案1】:

试试

m1 <- t(matrix(vec1, nrow=5, ncol=3))[,1:3]
m1[lower.tri(m1)] <- 0
m1
#     [,1]  [,2]  [,3]
#[1,] 14000 12000  8000
#[2,]     0 14000 12000
#[3,]     0     0 14000

或使用toeplitz

toeplitz(vec1)*upper.tri(diag(seq_along(vec1)), diag=TRUE)
#      [,1]  [,2]  [,3]
#[1,] 14000 12000  8000
#[2,]     0 14000 12000
#[3,]     0     0 14000

或@David Arenburg 建议的修改

m <- toeplitz(vec1)
m[lower.tri(m)] <- 0

【讨论】:

  • @DavidArenburg 我曾想过走lower.tri(m) 路线,但我选择了这条路线。
  • 你的回答比我的好;它可以很好地扩展。我特别喜欢toeplitz()。 +1
【解决方案2】:

在这个简单的例子中,您可以像这样分别分配对角线和上三角形部分:

m <- matrix(0, nrow=3, ncol=3)

diag(m) <- 14000

m[upper.tri(m)] <- c(12000, 8000, 12000)

但是,正如 David Arenburg 所指出的,这是一种更加手动的方法,因此无法很好地扩展。对于更自动化、可扩展的方法,我推荐使用 toeplitz()lower.tri() 的 akrun 解决方案。

为了您的具体情况的完整性,我将在此处保留此答案,但我认为 akrun 是更好的通用解决方案。

【讨论】:

  • diag(m) &lt;- 14000m[upper.tri(m)] &lt;- c(12000, 8000, 12000) 对我来说似乎很手动。你将如何使用随机向量来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多