小编psl*_*ice的帖子

随机SVD奇异值

随机SVD通过使用k + p个随机投影提取前k个奇异值/向量来分解矩阵.这对于大型矩阵来说效果非常好.

我的问题涉及从算法输出的奇异值.如果你做完整的SVD,为什么这些值不等于第一个k-奇异值?

下面我在R中有一个简单的实现.任何有关改善性能的建议都将受到赞赏.

rsvd = function(A, k=10, p=5) {
       n = nrow(A)
       y = A %*% matrix(rnorm(n * (k+p)), nrow=n)
       q = qr.Q(qr(y))
       b = t(q) %*% A
       svd = svd(b)
       list(u=q %*% svd$u, d=svd$d, v=svd$v)
       }

> set.seed(10)

> A <- matrix(rnorm(500*500),500,500)

> svd(A)$d[1:15]
 [1] 44.94307 44.48235 43.78984 43.44626 43.27146 43.15066 42.79720 42.54440 42.27439 42.21873 41.79763 41.51349 41.48338 41.35024 41.18068

> rsvd.o(A,10,5)$d
 [1] 34.83741 33.83411 33.09522 32.65761 32.34326 31.80868 31.38253 30.96395 30.79063 30.34387 30.04538 29.56061 29.24128 29.12612 …
Run Code Online (Sandbox Code Playgroud)

math performance r matrix

7
推荐指数
1
解决办法
1006
查看次数

在Google地图图块上绘制shapefile

我有一些我想在Google地图图块上绘制的shapefile.最有效的方法是什么?一条路径可能是使用pkg RgoogleMaps,但是,我仍然不清楚如何执行此操作.我假设使用PlotonStaticMap重新格式化shapefile数据

mapping google-maps r shapefile

5
推荐指数
1
解决办法
2750
查看次数

帮助加速R中的循环

基本上我想在R中执行对角平均.下面是一些改编自simsalabim包的代码来进行对角线平均.只有这个很慢.

有关矢量化而不是使用sapply的任何建议吗?

reconSSA <- function(S,v,group=1){
### S : matrix
### v : vector

    N <- length(v)
    L <- nrow(S)
    K <- N-L+1
    XX <- matrix(0,nrow=L,ncol=K)
    IND <- row(XX)+col(XX)-1
    XX <- matrix(v[row(XX)+col(XX)-1],nrow=L,ncol=K)
    XX <- S[,group] %*% t(t(XX) %*% S[,group])

    ##Diagonal Averaging
    .intFun <- function(i,x,ind) mean(x[ind==i])

    RC <- sapply(1:N,.intFun,x=XX,ind=IND)
    return(RC)
}
Run Code Online (Sandbox Code Playgroud)

对于数据,您可以使用以下内容

data(AirPassengers)
v <- AirPassengers
L <- 30
T <- length(v)
K <- T-L+1

x.b <- matrix(nrow=L,ncol=K)
x.b <- matrix(v[row(x.b)+col(x.b)-1],nrow=L,ncol=K)
S <- eigen(x.b %*% t(x.b))[["vectors"]] 
out <- reconSSA(S, v, 1:10)
Run Code Online (Sandbox Code Playgroud)

loops r

5
推荐指数
1
解决办法
662
查看次数

RcppArmadillo中的QR分解

真的很困惑为什么使用RcppArmadillo的QR输出与R的QR输出不同; 犰狳文献也没有给出明确的答案.基本上当我给R一个n*q的矩阵Y(比如1000 X 20)时,我得到的Q是1000 X 20和R 20 X 1000.这就是我需要的.但是当我在Armadillo中使用QR求解器时,它会让我回到Q 1000 X 1000和R 1000 X 20.我可以调用R的qr函数吗?我需要Q有维度nxq,而不是qx q.下面的代码是我正在使用的(它是更大功能的一部分).

如果有人可以建议如何在RcppEigen中做到这一点,那也会有所帮助.

library(inline)
library(RcppArmadillo)

src <- '
    Rcpp::NumericMatrix Xr(Xs);
    int q = Rcpp::as<int>(ys);

    int n = Xr.nrow(), k = Xr.ncol();
    arma::mat X(Xr.begin(), n, k, false);

    arma::mat G, Y, B;

    G = arma::randn(n,q);

    Y = X*G;

    arma::mat Q, R;
    arma::qr(Q,R,Y);

    return Rcpp::List::create(Rcpp::Named("Q")=Q,Rcpp::Named("R")=R,Rcpp::Named("Y")=Y);'


rsvd <- cxxfunction(signature(Xs="numeric", ys="integer"), body=src, plugin="RcppArmadillo")
Run Code Online (Sandbox Code Playgroud)

r decomposition armadillo rcpp

3
推荐指数
1
解决办法
1101
查看次数