错误:超出程序允许的最大变量大小。同时使用sub2ind

时间:2012-11-08 00:51:24

标签: matlab sparse-matrix

请建议如何解决此问题:

nNodes = 50400;
adj = sparse(nNodes,nNodes);

adj(sub2ind([nNodes nNodes], ind, ind + 1)) = 1; %ind is a vector of indices
??? Maximum variable size allowed by the program is exceeded.

2 个答案:

答案 0 :(得分:3)

我认为问题是32/64位相关。如果你有一个32位处理器,你最多可以解决

2^32 = 4.294967296e+09

元素。如果您有64位处理器,则此数字增加到

2^64 = 9.223372036854776e+18

不幸的是,由于最让我模糊的原因,Matlab并没有使用这个全范围。要找出Matlab使用的实际范围,请发出以下命令:

[~,maxSize] = computer

在32位系统上,这给出了

>> [~,maxSize] = computer
maxSize =
    2.147483647000000e+09
>> log2(maxSize)
ans =
    3.099999999932819e+01 

在64位系统上,它给出了

>> [~,maxSize] = computer
maxSize =
    2.814749767106550e+14
>> log2(maxSize)
ans =
    47.999999999999993

显然,在32位系统上,Matlab仅使用31位来寻址元素,这为您提供了上限。

  

如果有人能够澄清为什么Matlab在32位系统上只使用31位,而在64位系统上只使用 48 位,那就太棒了:))强>

在内部,Matlab总是使用线性索引来访问数组中的元素(它可能只是使用C风格的数组左右),这意味着你的adj矩阵的最终元素是

finEl = nNodes*nNodes = 2.54016e+09

不幸的是,这比31位的最大可寻址要大。因此,在32位系统上,

>> adj(end) = 1;
??? Maximum variable size allowed by the program is exceeded.

虽然此命令在64位系统上完全没有问题。

您必须在32位系统上使用解决方法:

nNodes = 50400;

% split sparse array up into 4 pieces
adj{1,1} = sparse(nNodes/2,nNodes/2);    adj{1,2} = sparse(nNodes/2,nNodes/2);
adj{2,1} = sparse(nNodes/2,nNodes/2);    adj{2,2} = sparse(nNodes/2,nNodes/2); 

% assign or index values to HUGE sparse arrays
function ret = indHuge(mat, inds, vals)

    % get size of cell
    sz = size(mat);

    % return current values when not given new values
    if nargin < 3
        % I have to leave this up to you...

    % otherwise, assign new values 
    else
        % I have to leave this up to you...

    end
end    

% now initialize desired elements to 1
adj = indHuge(adj, sub2ind([nNodes nNodes], ind, ind + 1),  1);

我只是想把所有这些都投入到一个合适的类中,这样你就可以使用更直观的语法......但这比我现在有时间要多得多:)

答案 1 :(得分:2)

adj = sparse(ind, ind + 1, ones(size(ind)), nNodes, nNodes, length(ind));

这很好......

并且,如果我们必须访问稀疏矩阵的最后一个元素,我们可以通过adj(nNodes,nNodes)访问,但adj(nNodes * nNodes)会抛出错误。