R 根据列向量子集矩阵

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,我想从每一行中选择一个值,从向量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(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]