楼上同学的解决方案中有一个小错误,代码的第三行应该是:
colprod <- vector(length = nrow(x))
可能是编的快,疏忽了。
楼主的这个问题,我尝试用向量化来解决,发现力不从心。该问题似乎是循环起来很简单,但是向量化非常吃力的那种问题,并且,该问题的计算量随着列数的增长而呈现几何级数地增加的。在我的电脑中,当列数过1000后,耗时就比较明显了。于是,我想用Rcpp包的C++程序来解决这个问题:
- # 需安装和配置Rtools工具
- library(Rcpp)
- cppFunction('NumericVector colprodC(NumericMatrix x) {
- int nrow = x.nrow(), ncol = x.ncol();
- NumericVector out(nrow);
- for (int i = 0; i < (ncol - 1); i++) {
- for (int j = (i + 1); j < ncol; j++) {
- for (int r = 0; r < nrow; r++) {
- out[r] += x(r, i) * x(r, j);
- }
- }
- }
- return out;
- }')
- colprodC(mat)
复制代码在我的电脑上运行,速度提升大概36倍左右,不是很让人满意,是不是我的程序还有问题,请大神指点。