请建议如何解决此问题:
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.
答案 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)会抛出错误。