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