2017-08-25 36 views
0

我意识到有3个问题具有类似的异常消息。不幸的是,没有任何问题得到解答,评论无法解决我的问题。Octave - 内存不足或Octave索引类型的维度过大

我在64位版本的Windows 10系统上使用Octave 4.2.1,总共16 GB RAM,运行时可以使用约11 GB的空间。 当我尝试乘以60000×10矩阵,10×60000矩阵倍频想出了以下异常:

error: out of memory or dimension too large for Octave's index type

这个乘法将导致60000 X 60000矩阵,因此不应该是一个问题一个64位的索引。 我什至不能做zeros(60000,60000);

我不明白我做错了什么。有人能指引我走向正确的方向吗?

回答

3

由于通常情况下,这种错误常常被误解(也许我们应该解决这个问题作为八度跟踪器已经是一个错误;))

>> 60000*60000 
ans = 3.6000e+09 
>> intmax 
ans = 2147483647 
>> 60000*60000 > intmax 
ans = 1 

即所得到的60000x60000矩阵的元素数量大于系统支持的最大整数表示,因此无法使用整数索引对这样的矩阵进行线性索引。

此外,为了使用实际 64位索引,你需要编译倍频以这种方式,因为这往往不被默认的,但不幸的是,这不是那么简单,因为你可能会想,为你”我们也必须使用相应的64位支持库。更多关于那here。如上所述,如果您的矩阵确实是稀疏矩阵,那么可以使用稀疏矩阵来代替。如果没有,你基本上使用'大数据',你需要找到解决方法,比如块处理/将大数组映射到文件等等。值得关注一下常见的“大数据”技术。不幸的是,octave似乎还没有支持matlab的memmapfile命令,但是您可以使用fwrite/fread/fseek来适当地从文件中读取适当的范围。

+2

Tatsuro提供了一些官方的windows版本,并且提供了实验性的大型数组支持(http://www.tatsuromatsuoka.com/octave/Eng/Win/)。据我所知,其他一些用户使用64bit * INDEXING *在线构建。 Yannic可能会在邮件列表中查找录音 – Andy

+1

谢谢你非常详细的回答:) –

+0

因此错误消息使人们认为他们正在达到内存限制。发生什么情况会导致无法分割此错误消息,以便告知用户他/她做了哪一个? –