r - 创建三角矩阵

标签 r matrix

必须有一种优雅的方式来做到这一点,但我想不通:

列是从 1 到 0 向右的概率

行是从 0 到 1 下降的概率

这个困惑的代码产生了想要的结果(但我想用比这大得多的矩阵来做):

# Vector entries are rowname - colname, if >= 0
#
rb0 <-  c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA, 0)
rb1 <-  c(NA,NA,NA,NA,NA,NA,NA,NA,NA, 0,.1)
rb2 <-  c(NA,NA,NA,NA,NA,NA,NA,NA, 0,.1,.2)
rb3 <-  c(NA,NA,NA,NA,NA,NA,NA, 0,.1,.2,.3)
rb4 <-  c(NA,NA,NA,NA,NA,NA, 0,.1,.2,.3,.4)
rb5 <-  c(NA,NA,NA,NA,NA, 0,.1,.2,.3,.4,.5)
rb6 <-  c(NA,NA,NA,NA, 0,.1,.2,.3,.4,.5,.6)
rb7 <-  c(NA,NA,NA, 0,.1,.2,.3,.4,.5,.6,.7)
rb8 <-  c(NA,NA, 0,.1,.2,.3,.4,.5,.6,.7,.8)
rb9 <-  c(NA, 0,.1,.2,.3,.4,.5,.6,.7,.8,.9)
rb10 <- c( 0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1 )
indbias <- rbind(rb0,rb1,rb2,rb3,rb4,rb5,rb6,rb7,rb8,rb9,rb10)
colnames(indbias) <- seq(1,0,by=-.1)
rownames(indbias) <- seq(0,1,by=.1)
indbias

谢谢!

最佳答案

 mat <- matrix(NA, 10,10)
 mat[row(mat)+col(mat) >=11] <- (row(mat)+col(mat) -11)[row(mat)+col(mat)>=11]/10
 mat
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   0.0
 [2,]   NA   NA   NA   NA   NA   NA   NA   NA  0.0   0.1
 [3,]   NA   NA   NA   NA   NA   NA   NA  0.0  0.1   0.2
 [4,]   NA   NA   NA   NA   NA   NA  0.0  0.1  0.2   0.3
 [5,]   NA   NA   NA   NA   NA  0.0  0.1  0.2  0.3   0.4
 [6,]   NA   NA   NA   NA  0.0  0.1  0.2  0.3  0.4   0.5
 [7,]   NA   NA   NA  0.0  0.1  0.2  0.3  0.4  0.5   0.6
 [8,]   NA   NA  0.0  0.1  0.2  0.3  0.4  0.5  0.6   0.7
 [9,]   NA  0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7   0.8
[10,]    0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8   0.9

我认为这将比 plyr 解决方案快得多,而且我认为它更容易理解。它基本上为右下角“三角形”中的条目设置测试,然后将该“测试”矩阵的结果除以 10。您可以使用以下代码查看测试矩阵:
row(mat)+col(mat) -11

编辑:我认为有可能像 sebastian-c 说明的那样制作一次矩阵,然后进行单个测试来进行 NA 设置可能会更快(对 rowcol 的调用次数是三分之一),但它出现速度只有三分之一。看起来两个 seq 调用比 extra 花费更多的时间:
mat <- round(outer(seq(-0.5, 0.5, 0.1), seq(-0.5, 0.5, 0.1), `+`), 1)
is.na(mat) <- row(mat)+col(mat) <= 11
mat

我确实找到了另一个基于鲜为人知的解决方案 embed功能:
mat <- embed(seq(-1,1, by=0.1), 11 )[,11:1]
is.na(mat) <- row(mat)+col(mat) <= 11

虽然它比新解决方案快 50%,但仍然比原始解决方案慢。

关于r - 创建三角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786795/

相关文章:

python - theano 中用索引矩阵索引张量?

r - 如何将表转换为 r 中的数据框?

删除因子水平为 1 的变量

r - 如何根据 R 中另一列中的值将连续数字 block 添加到数据帧

C - 求解魔方

c - 优化以及为什么 openmp 比顺序方式慢得多?

matlab - 两幅图像之间的相关性

R Sweave "not run"选项

r - 如何将 R 数据帧作为 CSV 文件上传到 Azure Blob 存储上?

c++ - 析构函数立即调用并删除我的数组