内存有效的替代MeshGrid

时间:2019-06-24 15:15:46

标签: matlab memory repeat memory-efficient

假设一个简单的示例,其中有索引

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。我很可能是从那里找到这个想法的。

2 个答案:

答案 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数量。