我需要将三个矩阵X(Nxk),FF(kxk)和X(Nxk)相乘(再次)。其中t(xi)* FF * xi,其中xi是X的第i行,i = 1:N。结果将是具有N行的单个列矩阵。乘法也可以视为X * FF * t(X)。
(Nxk)代表" N行,k列",*是代数乘法,t()转置。
问题在于N非常大(超过100k)。我找到了一些使用drop和sweep进行快速乘法的建议。但他们只考虑问题的一半 - 用矩阵乘以向量。
由于X的大小,我想避免两个阶段A = X FF然后A t(X)的乘法。所以我需要的是一些函数或提示,它乘以三个矩阵一次(尽可能多),以便在R中尽可能快地进行计算。
答案 0 :(得分:0)
如果您只需要 XFX' ,sweep
和Matrix
是红色鲱鱼。这些帖子描述了不同的问题。
在开始more involved之前,您可以看到library(Matrix)
library(microbenchmark)
# sparse matrix from Matrix
data(CAex)
# create a possible FF
set.seed(1)
FF = matrix(rnorm(length(CAex)), nrow = nrow(CAex), ncol = nrow(CAex))
# not a sparse matrix
CA = as.matrix(CAex)
microbenchmark(
matrix = CA %*% crossprod(FF, CA),
Matrix = CAex %*% crossprod(FF, CAex))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# matrix 561.170 563.952 654.8408 588.1250 651.673 1403.389 100 b
# Matrix 94.356 102.866 173.1130 119.9435 165.542 1815.316 100 a
是否为您提供了足够的速度。
func cutout(us:String)
{
let scanner = NSScanner(string:us)
var scanned: NSString?
if scanner.scanUpToString("://", intoString:nil) {
scanner.scanString("://", intoString:nil)
if scanner.scanUpToString("width", intoString:&scanned) {
let result: String = scanned as! String
print("result: \(result)")
urlStringmy = result// result: google
stringcutter()
}
}
}