我正在创建一个数组的网格或组合向量。完整的组合向量是如此之大,以至于MATLAB提示我"内存不足"。错误。我已经写了一个代码来创建网格,这取决于变量"Col"
Col=9;
numMatrix = uint8([1 2 3]);
meshString=strcat("a3 = combvec(" ,repmat('numMatrix ,', 1, Col-1), "numMat )")
eval(meshString);
如果Col值为9,则形成的矩阵的大小为:
Variable Size Byte
a3 9x19683 1417176 double
这个代码的问题是,如果我的Col值是25,那么a3的大小将是25x3^25,这需要253^258/1024/1024 GB的RAM (1.5782e+05 GB),这是不可实现的。所以我想创建一个特定的组合范围。例如,如果只直接有前50000个组合,那么在处理后进行下一个50000个组合。
p。S:我还使用了函数[b1,b2....,b25]=ndgrid(1:3)来创建b的网格,然后将它们扁平化以形成组合。它也有上面解释的同样的问题。
combvec
的输出是完全可预测的,所以您可以简单地单独计算每个迭代,而不是生成整个向量。
让我们举一个简单的例子:
% we compute combvec(1:3,1:3,1:3,1:3)
n = 4;
x = 1:3;
x = repmat({x},n,1)
y = combvec(x{:})
这里y
是一个4x81
矩阵。我们注意到,由于我们只使用向量[1,2,3]
的组合,那么j-th
列将对应于以3为基数的j-1
。
所以我们可以写一个小函数来转换以3为基数的十进制数:
function r = f(j,n)
r = fliplr(dec2base(j-1,3,n)-47).' % small tricks with -47 to implicitely convert a char to its ascii value minus 47.
end
现在我们可以验证等式了,比如用j=10:
all(f(10,n) == y(:,10))
结果我们确实得到了:True
。
它也适用于多个值:
all(f(9:10,n) == y(:,9:10))
所以你只需要添加最后一行combvec,现在你可以拆分你的操作,让你的电脑运行一周。