【问题标题】:how to create a very large matrix using matlab如何使用matlab创建一个非常大的矩阵
【发布时间】:2010-02-02 11:14:24
【问题描述】:

当我尝试创建一个非常大的矩阵(例如 40000x40000)时,我遇到了 matlab 问题。

例如:

x=zeros(40000,40000);

错误信息是“???超出程序允许的最大变量大小。”

有什么解决办法吗。

另外我还有一个问题,我们能不能有一个可变列大小的矩阵,比如在 java 中。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    40000 * 40000 * 每个数字 8 字节 = 12 GB,你肯定没有足够的内存。

    要创建一个包含大量零的巨大矩阵,您需要一个稀疏矩阵

    m = sparse(40000, 40000)
    

    要创建变体数组,您可以使用元胞数组

    m = cell(3, 1)
    m(1) = [1,2,3]
    m(2) = [2,4,6,8,10]
    m(3) = 6+6i
    

    【讨论】:

      【解决方案2】:

      正如各种答案所指出的那样,您可以做很多事情。正确答案取决于您的实际问题。如果没有 64 位版本的 matlab 加上足够的内存来存储这么大的数组,或者以其他方式存储数组,那么暴力创建如此大的数组是不可能的。您可以离线存储阵列,只在使用时带入您需要的东西。

      例如,如果这些数字总是小整数,那么使用 uint8 或 int8,或者逻辑数组,甚至是单数组,所有这些都将比双数组减少内存需求。或者酌情使用稀疏存储形式。很大程度上取决于您将如何处理数组。

      就一行中可变数量的元素而言,这里使用元胞数组,而不是平面的传统数组。

      【讨论】:

        【解决方案3】:

        如果你真的需要这么大的矩阵,你可以使用Parallel Computing Toolbox(和MATLAB Distributed Computing Server)同时利用多台机器的内存。这将允许您编写:

        matlabpool open <a large number>
        x = distributed.zeros( 40000, 40000 );
        

        另见:doc for codistributed arrays

        【讨论】:

          【解决方案4】:

          40k*40k => 1.6*10^9 个数字。我相信 Zeros 会返回浮点数。所以你需要大约 1.6*10^9 Floats *4 Bytes/Float => 6.4GB 的 RAM 只是为了这个变量...

          你确定需要这么大的数组吗?

          【讨论】:

            【解决方案5】:

            解决内存问题的一种方法可能是为您的矩阵创建一个matfile。我理解它的方式是它跳过内存并将其直接写入您的硬盘。我已经尝试过这个对于我的计算机内存来说太大的矩阵,它很慢,但它确实有效。您可能必须一次建立一点。

            【讨论】:

              【解决方案6】:

              不,是的,购买更多内存,如下所述。 Sparse 只是删除零个元素。

              在 matlab 中,您可以将新的 col/rows 附加到矩阵中以生成更大的矩阵。

              啊,但你的意思是,你能有一个矩阵,其中一列是 10 行,另一列是 20 行。不,你不能那样做。没想到你可以在 Java tbh 中。

              【讨论】:

                【解决方案7】:

                我认为使用硬盘文件来存储数据是最好的选择

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-05
                  • 2015-08-05
                  • 2018-07-12
                  • 2014-09-07
                  • 2016-08-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多