假设一个简单的示例,其中有索引
index_pos = [3,4,5];
index_neg = [1,2];
我想要一个矩阵:
result =
1 3
2 3
1 4
2 4
1 5
2 5
为此,我编写了以下代码:
[X,Y] = meshgrid(index_pos,index_neg);
result = [Y(:) X(:)];
我认为这不是一种非常有效的方法。另外,当我使用大实例时,这会占用过多的内存。我收到以下错误:
Error using repmat
Out of memory. Type "help memory" for your options.
Error in meshgrid (line 58)
xx = repmat(xrow,size(ycol));
Error in FME_funct (line 36)
[X,Y] = meshgrid(index_pos,index_neg);
是否有使用内存更少的“聪明”方法来生成此矩阵?
PS:我注意到我的工作也得到了here。我很可能是从那里找到这个想法的。
答案 0 :(得分:3)
这完全取决于两个变量相对于计算机内存量(以及您使用的数字类型)的大小。 试试这个:
res = zeros(numel(index_neg)*numel(index_pos), 2)
如果这使您遇到内存不足的错误,则无论生成器的效率如何,您的计算机中都没有足够的内存来存储结果,因此,如果出现上述错误,则说明您陷入困境。如果没有错误,那么您可以编写一种使用较少临时内存的循环算法。
也就是说,默认情况下,MATLAB以双精度表示数字,每个数字8个字节。如果您的index_
变量恰好包含正整数(均小于65,536),则可以使用16位无符号整数。每个数字只有2个字节,因此占用的空间比双倍少4倍。您可以使用以下方法进行测试:
res = zeros(numel(index_neg)*numel(index_pos), 2, 'uint16')
最后,您可以使用memory
命令找出MATLAB可用的内存量。
答案 1 :(得分:0)
这是一种更快的生成此类矩阵的方法。通过直接在适当位置构建矩阵来避免显式的临时数组,
res2 = [ reshape( bsxfun( @times , index_neg.' , ones(size(index_pos)) ) , [] , 1 ) , ...
reshape( bsxfun( @times , index_pos , ones(size(index_neg)).' ) , [] , 1 ) ] ;
请注意,这需要相同的内存量来容纳主数组,因此将无法生成比您的方法更大的数组(在meshgrid
阶段失败)。此最大大小最终取决于系统可用的RAM数量。