- R语言的最大数值
在R语言里面,所能计算的最大数值可以用下面的方法获得:
###R可计算最大数值
.Machine
在编程的时候注意不要超过这个数值。当然,普通情况下也不可能超过的。
- R语言的最大精度
R语言的舍入误差要比python好不少,但是也还是有的。
###最小非零整数 2^-1074 ###最大数 2^1023 ###机器误差 2^-52 + 1 - 1 2^-53 + 1 - 1 ###比较两个数字 all.equal(2^-12 + 1,2^-13 + 1,tolerance = 1e-7)
上面所谓的机器误差就是不可避免的最小误差,在做运算时会被舍弃。至于在什么情况下舍弃,取决于两个数之间的误差是均方根,系统默认的均方根是10^-8,小于这个值的时候R就会默认它们相等。使用all.equal函数可以自己设定均方根的阈值,即tolerance.
- R语言的时间消耗
###创建向量会更浪费时间 n <- 1e6 x <- rep(0,n) system.time(for(i in 1:n) x[i] <- i^2) x <- c() system.time(for(i in 1:n) x[i] <- i^2)
可以看到时间差距还是很大的。
###矩阵的列求和 ###全部使用循环,不使用sum函数 Bmatrix <- matrix(1:1e6,nrow = 1000) colsums <- rep(NA, ncol(Bmatrix)) system.time(for(i in 1:ncol(Bmatrix)){ s <- 0 for(j in 1:1000){ s <- s + Bmatrix[j,i] } colsums[i] <- s }) ###使用apply和sum system.time(colsums <- apply(Bmatrix,2,sum)) ###使用sum和循环 system.time(for(i in 1:ncol(Bmatrix)){ colsums[i] <- sum(Bmatrix[,i]) }) ###使用系统函数 system.time(colsums <- colSums(Bmatrix))
上面的结果随着电脑的不同应该是不一样的,但是整体上来看肯定使用系统函数是最快的,其次是用sum函数,但是for和apply的效率是一样的,因为apply本来就是做的循环运算:
###apply里面的for结构/膜拜大佬的代码 ans <- vector("list", d2) if (length(d.call) < 2L) { if (length(dn.call)) dimnames(newX) <- c(dn.call, list(NULL)) for (i in 1L:d2) { tmp <- forceAndCall(1, FUN, newX[, i], ...) if (!is.null(tmp)) ans[[i]] <- tmp } } else for (i in 1L:d2) { tmp <- forceAndCall(1, FUN, array(newX[, i], d.call, dn.call), ...) if (!is.null(tmp)) ans[[i]] <- tmp }
###colSums的函数结构 function (x, na.rm = FALSE, dims = 1L) { if (is.data.frame(x)) x <- as.matrix(x) if (!is.array(x) || length(dn <- dim(x)) < 2L) stop("'x' must be an array of at least two dimensions") if (dims < 1L || dims > length(dn) - 1L) stop("invalid 'dims'") n <- prod(dn[id <- seq_len(dims)]) dn <- dn[-id] z <- if (is.complex(x)) .Internal(colSums(Re(x), n, prod(dn), na.rm)) + (0+1i) * .Internal(colSums(Im(x), n, prod(dn), na.rm)) else .Internal(colSums(x, n, prod(dn), na.rm)) if (length(dn) > 1L) { dim(z) <- dn dimnames(z) <- dimnames(x)[-id] } else names(z) <- dimnames(x)[[dims + 1L]] z }
这个代码。。。里面还调用的colSums,有没有童鞋可以帮我解释一下这是为啥。