R 根据列向量子集矩阵
我有一个矩阵H,我想从每一行中选择一个值,从向量p中选择列R 根据列向量子集矩阵,r,matrix,R,Matrix,我有一个矩阵H,我想从每一行中选择一个值,从向量p中选择列 H = matrix(data=runif(6),ncol=2) P = c(2,1,2) 我所追求的输出是一个包含 c(H[1,P[1]],H[2,P[2]],H[3,P[3]]) 我正在处理更大的数据,所以一种通用的方法会很好 这可以使用diag(H[,p]),但是:a)我不明白为什么H[,p]返回一个平方矩阵,b)我不想使用额外的函数(在本例中是diag) 如果以前有人问过,我深表歉意。试试看 H[cbind(seq_len(
H = matrix(data=runif(6),ncol=2)
P = c(2,1,2)
我所追求的输出是一个包含
c(H[1,P[1]],H[2,P[2]],H[3,P[3]])
我正在处理更大的数据,所以一种通用的方法会很好
这可以使用diag(H[,p])
,但是:a)我不明白为什么H[,p]
返回一个平方矩阵,b)我不想使用额外的函数(在本例中是diag
)
如果以前有人问过,我深表歉意。试试看
H[cbind(seq_len(nrow(H)), P)]
## [1] 0.6733731 0.7396847 0.5953580
这里我们通过p
关于您的问题,之所以
H[,p]
返回矩阵是因为您告诉R:
从矩阵“H”中选择列2、1、2中的所有行
因此,您得到的结果是一个具有相同第一列和第三列的矩阵
这是可行的,但是:a)我不明白为什么H[,p]返回一个平方
矩阵
H[,p]返回一个平方矩阵,因为p是长度为3的向量。在这里,您基本上是说您希望矩阵返回第2列、第1列和第2列
如果需要一个值,那么还需要传递一行。如果你想让它随机选择一行或者给它一个特定的行,你可以给它传递一个随机数或者其他东西。例如,第1行:
H[1,P]
或随机(但整个矩阵相同)行:
谢谢你。我尝试了h[1:3,P],希望这能给我期望的结果,但它不起作用。
diag(h[,P])
有效,因为它在调用diag
之前将列加至P的长度,这在大型矩阵上效率较低。下面大卫的回答很好,谢谢。一个简单的速度测试表明,对于多大的数据集,这种方法比diag(H[,P])1:dim(H)[2]
的速度大约是seq_len(nrow(H))
的两倍。对于(1:10e4中的循环)1:dim(H)[2])rm list=ls()H=array(data=0,dim=c(10e3,10e3))
系统时间(1:10e4循环)序列号(nrow(H))
H=array(data=0,dim=c(10e1,10e1))
系统时间(对于(1:10e6循环)1:dim(H)[2])系统时间(对于(1:10e6循环)序列号(nrow(H))
H[floor(runif(1, 1, dim(H)[1])),P]