我想比较一个巨大的向量与R中矩阵中的选定元素 .
A是矩阵,B是矢量 . 我想比较B的每个元素与来自A的选定元素.C和D是选择标准 . 它们是与B相同长度的向量.C指定A的行号,D指定列号 . A的维数为10 * 100,B,C,D都是长度为72000的向量 . 代码为for循环:
for ( j in 1:length(B) ){
E[j] <- B[j] >= A[ C[j], D[j] ]
}
这太慢了 . 我通过定义一个包含来自A的元素的向量来对此进行矢量化:
A1 <- array(0, length(B))
A2 <- A[,D]
for ( j in 1:length(B) ){
A1[j] <- A2[ C[j], j ]
}
E <- B >= A1
这仍然太慢了 . 有更好的方法吗?
3 回答
我能想到的绝对最快的方法是将A视为向量并提取所需的元素 . 矩阵实际上只是具有维度属性的向量 . 算术运算非常快,并且
[
子集运算符被矢量化 .要获得所需的元素,您需要做的就是将所需的列号(
D
)乘以总行数,然后减去所需的行号(C
)减去总行数,例如A[ D * nrow(A) - ( nrow(A) - C) ]
,如下例所示:您可以根据选择标准B和C轻松选择与B的每个条目对应的A的每个元素 . 将B和C组合成两列矩阵,然后使用该矩阵组合A:
您现在有一个与B长度相同的向量(A.subset),并且可以以高效的方式执行您喜欢的任何(矢量化)比较 .
我不确定我是否完全接受了您的问题,但我认为您需要以下内容: