r - 根据 R 中另一个矩阵给出的位置更改一个矩阵中的元素
问题描述
假设我有一个对称矩阵A
,例如:
> A <- matrix(runif(16),nrow = 4,byrow = T)
> ind <- lower.tri(A)
> A[ind] <- t(A)[ind]
> A
[,1] [,2] [,3] [,4]
[1,] 0.4212778 0.6874073 0.1551896 0.46757640
[2,] 0.6874073 0.5610995 0.1779030 0.54072946
[3,] 0.1551896 0.1779030 0.9515304 0.79429777
[4,] 0.4675764 0.5407295 0.7942978 0.01206526
我还有一个4 x 3
矩阵B
,它给出了 matrix 的特定位置A
,例如:
> B<-matrix(c(1,2,4,2,1,3,3,2,4,4,1,3),nrow=4,byrow = T)
> B
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 2 1 3
[3,] 3 2 4
[4,] 4 1 3
该B
矩阵表示 的以下位置A
:(1,1), (1,2), (1,4), (2,2), (2,1), (2,3), (3,3), (3,2), (3,4), (4,4), (4,1), (4,3)
。
我想更改A
不在 给出的位置的值B
,将它们替换为Inf
。我想要的结果是:
[,1] [,2] [,3] [,4]
[1,] 0.4212778 0.6874073 Inf 0.46757640
[2,] 0.6874073 0.5610995 0.1779030 Inf
[3,] Inf 0.1779030 0.9515304 0.79429777
[4,] 0.4675764 Inf 0.7942978 0.01206526
我怎样才能快速避免for
循环(我可以编码)?我看过很多类似的帖子,但没有人给我想要的东西。谢谢!
解决方案
您想做一些类似矩阵子集(例如,P[Q]
)的事情,但您不能在矩阵子集中使用负索引(例如,P[-Q]
不允许)。这是一个解决方法。
将要保留的元素存储A
在 2 列矩阵中,其中每行的坐标为A
:
Idx <- cbind(rep(1:4, each=ncol(B)), as.vector(t(B)))
创建一个所有值都为 的矩阵Inf
,然后覆盖您想要“保留”的值A
:
Res <- matrix(Inf, nrow=nrow(A), ncol=ncol(A))
Res[Idx] <- A[Idx]
结果
Res
# [,1] [,2] [,3] [,4]
#[1,] 0.9043131 0.639718071 Inf 0.19158238
#[2,] 0.6397181 0.601327568 0.007363378 Inf
#[3,] Inf 0.007363378 0.752123162 0.61428003
#[4,] 0.1915824 Inf 0.614280026 0.02932679
推荐阅读
- jquery - 使用 nextUntil 的 jQuery 手风琴
- javascript - 滚动时滑入的所有标题 - JavaScript
- selenium - 在 Naukri 主页上选择位置时 sendKeys(Keys.ARROW_DOWN) 不起作用
- salesforce - 如何将 url 参数传递到 Salesforce Lightning 页面中的分析仪表板
- python - 如何将json中的数据存储在sql表中(python)
- java - 我的测试注释不起作用,eclipse 要求主要方法
- spring - 如何使用 PactVerificationSpringProvider 和 Junit5 为协议提供程序测试添加标头?
- c++ - UE4 CableComponent 因未知原因未渲染
- python - 如何在 Pandas Python 上设置多列?
- java - 如何检查用户是否存在于 Radius 服务器中