矩阵计算错误

时间:2011-02-05 13:06:07

标签: math r matrix

我正在使用R工具来计算SVD(svd(m))并且它适用于小矩阵,但是当我传递它20Kx20X矩阵时。处理后,它会出现以下错误

Error in svd(m) : infinite or missing values in 'x'

我检查过,没有行或列的所有0值,并且没有重复的行和 柱。所有列都有值。

我在这里不能超过20Kx20K矩阵:(

3 个答案:

答案 0 :(得分:1)

我猜你的问题与内存大小无关,虽然我无法在4GB内存机器上处理20Kx20K矩阵。

猜测的原因是svd()内的第一行代码如下:

if (any(!is.finite(x))) 
    stop("infinite or missing values in 'x'")

换句话说,svd()函数首先测试数据中是否存在任何无限值。

之前进行任何进一步处理。因此,如果您遇到内存问题,即使在调用svd()之前,这些内容也会很明显。

我建议您检查无限值:

x <- c(0, Inf, NA, NULL)
which(!is.finite(x))

[1] 2 3

这表明第二和第三个值被认为不是有限的。换句话说,数据中任何 NA值都会导致错误。

答案 1 :(得分:0)

如果您正在存储8个字节的双精度数,则20Kx20K意味着8 * 20,000 * 20,000 / 1024 / 1024~3GB的RAM可以将整个内容保存在内存中。

我不知道你有多少RAM可用,但我会研究R可以根据需要将矩阵序列化到磁盘上。

矩阵是稀疏的还是带状的?你能做些什么来减少你需要的内存量吗?

矩阵的零空间有多大?什么是条件数(最大到最小特征值的比率)?大的条件数可以表示解决困难。矩阵不需要零行或列几乎是单数。

更新:

根据您的评论,我会说RAM是您遇到的问题中最少的。听起来有可能将整个矩阵保存在内存中 - 如果你可以解决所有问题。您可以处理整个矩阵。你在64位操作系统上运行 - 你的R 64位版本也是?

不幸的是,SVD的副产品之一是获得零空间的大小。

您可以使用Jacobi迭代获得矩阵的最小特征值。 Lanczos可能是获得最大特征值的好选择。得到所有这些都需要做很多工作;你可能只想要评估最小和最小的五个。

我遇到某些软件时出错,我会立即将其粘贴到Google搜索中。至少我很高兴知道我不是第一个遇到特定问题的人:

http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=Error+in+svd(m)+:+infinite+or+missing+values+in+的 'x'

答案 2 :(得分:0)

可能svd计算本身也会占用大量内存。如果我们比较MATLAB,我们看到svd计算分配的内存与矩阵本身使用的内存一样多,所以如果你已经有3GB的内存,那么svd计算可能会分配另外3GB,这会产生6GB的内存。