Select MATLAB 中组合向量中元素的特定范围

Select specific range of elements in Combination vector in MATLAB

我正在创建网格或数组的组合向量。完整的组合向量太大,以至于 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/ 的 RAM 1024/1024/1024 GB (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,现在你可以拆分你的操作,让你的计算机 运行 一周。