gpt4 book ai didi

r - 在 R 中索引矩阵的元素

转载 作者:行者123 更新时间:2023-12-03 21:06:16 24 4
gpt4 key购买 nike

这个问题很愚蠢,但我想知道我是否遗漏了什么。
假设有一个向量 k包含一些数字,比如说

> k
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

我想将其转换为矩阵
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 0 6 7 8 9
[3,] 0 0 10 11 12
[4,] 0 0 0 13 14
[5,] 0 0 0 0 15

我的第一个想法是使用 upper.tri() 的东西。 ,例如像 m[upper.tri(m, diag = TRUE)] <- k ,但这不会给出上面的矩阵。

有没有更智能的解决方案?下面是我的解决方案,但让我们说我并不太为此感到自豪。
rows <- rep(1:5, 5:1)

cols1 <- rle(rows)$lengths


cols <- do.call(c, lapply(1:length(cols1), function(x) x:5))

for(i in 1:length(k)) {
m[rows[i], cols[i]] <- k[i]
}

最佳答案

这是使用 lower.tri 的选项和 t转置结果:

k <- 1:15
m <- matrix(0, 5,5)
m[lower.tri(m, diag = TRUE)] <- k
m <- t(m)
m
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 0 6 7 8 9
#[3,] 0 0 10 11 12
#[4,] 0 0 0 13 14
#[5,] 0 0 0 0 15

微基准测试

由于对 Joseph 的基准有些混淆,这里是另一个。我测试了大小为 10*10 的矩阵的三种解决方案; 100*100; 1000*1000; 10000*10000。

结果:

pic

显然,性能在很大程度上取决于矩阵的大小。对于大型矩阵,Joseph 的答案执行得最快,而对于较小的矩阵,我的方法是最快的。请注意,这并没有考虑内存效率。

可重现的基准:
Joseph <- function(k, n) {
y <- 1L
t <- rep(0L,n)
j <- c(y, sapply(1:(n-1L), function(x) y <<- y+(n+1L)-x))
t(vapply(1:n, function(x) c(rep(0L,x-1L),k[j[x]:(j[x]+n-x)]), t, USE.NAMES = FALSE))
}

Frank <- function(k, n) {
m = matrix(0L, n, n)
m[ which(lower.tri(m, diag=TRUE), arr.ind=TRUE)[, 2:1] ] = k
m
}

docendo <- function(k,n) {
m <- matrix(0L, n, n)
m[lower.tri(m, diag = TRUE)] <- k
t(m)
}

library(microbenchmark)
library(data.table)
library(ggplot2)
n <- c(10L, 100L, 1000L, 10000L)
k <- lapply(n, function(x) seq.int((x^2 + x)/2))

b <- lapply(seq_along(n), function(i) {
bm <- microbenchmark(Joseph(k[[i]], n[i]), Frank(k[[i]], n[i]), docendo(k[[i]], n[i]), times = 10L)
bm$n <- n[i]
bm
})

b1 <- rbindlist(b)

ggplot(b1, aes(expr, time)) +
geom_violin() +
facet_wrap(~ n, scales = "free_y") +
ggtitle("Benchmark for n = c(10L, 100L, 1000L, 10000L)")

检查结果是否相等:
all.equal(Joseph(k[[1]], n[1]), Frank(k[[1]], n[1]))
#[1] TRUE
all.equal(Joseph(k[[1]], n[1]), docendo(k[[1]], n[1]))
#[1] TRUE

注:我没有在比较中包括 George 的方法,因为从 Joseph 的结果来看,它似乎要慢得多。所以在我的基准测试中比较的所有方法都只用基础 R 编写。

关于r - 在 R 中索引矩阵的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37615790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com