r - 给定向量和 0 沿反对角线排列生成 5x5 矩阵

标签 r matrix vectorization diagonal

给定以下向量:

v <- c(2, 4, 6, 8)

需要以下矩阵,其中行方向交替从右到左和从左到右(通过从上到下遍历矩阵)并且反对角线设置为零。

8  6  4  2  0
2  4  6  0  8
8  6  0  4  2
2  0  4  6  8
0  8  6  4  2

如何在 R 中有效地实现这一点?

最佳答案

这个怎么样?

v <- c(2, 4, 6, 8)

首先用 v 的交替方向创建一个矩阵。因为矩阵是按列填充的,所以我们最后必须进行转置。

m <- matrix(0, length(v), length(v) + 1)
m[, c(FALSE, TRUE)] <- rev(v)
m[, c(TRUE, FALSE)] <- v

m <- t(m)

现在通过填充上下三角形然后反转列来创建零反对角线:

m1 <- matrix(0, length(v) + 1, length(v) + 1)
m1[upper.tri(m1)] <- m[upper.tri(m, TRUE)]
m1[lower.tri(m1)] <- m[lower.tri(m)]
m1[, rev(seq_len(ncol(m1)))]

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    8    6    4    2    0
#[2,]    2    4    6    0    8
#[3,]    8    6    0    4    2
#[4,]    2    0    4    6    8
#[5,]    0    8    6    4    2

我希望这对于更大尺寸的向量来说是一种有效的解决方案。对于小向量,基于循环的解决方案可能更快。

关于r - 给定向量和 0 沿反对角线排列生成 5x5 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38430765/

相关文章:

r - dplyr:根据列的匹配字符串改变列

r - 让 rbind 忽略列名的最简单方法

javascript - 掌握了 90% 的 JavaScript 代码 - 无法理解其余部分

python - 从两个矩阵乘积的条目填充 4d 数组的有效方法

python - 矢量化(手动)正向替换

r - 在用户定义函数中使用 step() 时丢失对象错误

r - library(rgl) 在 Windows 上破坏 R

c - 如何检查矩阵反对角线上的项是否相同?

opengl - 如何创建透视投影矩阵,给定焦点和相机主中心

R:有条件地将数据从一个数据帧提取到另一个