假设一个简单的例子,我有索引
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 。我很可能是从那里发现了这个想法。
最佳答案
这完全取决于您的两个变量与计算机内存量(加上您正在使用的数字类型)的关系。 试试这个:
res = zeros(numel(index_neg)*numel(index_pos), 2)
如果这给你带来了内存不足的错误,那么无论生成器的效率如何,你的计算机中都没有足够的内存来存储结果,所以如果出现上述错误,那么你就会陷入困境。如果没有错误,那么您可以编写一个使用较少临时内存的循环算法。
也就是说,默认情况下 MATLAB 表示 double 字,每个数字 8 个字节。如果您的 index_
变量碰巧仅包含正整数(全部小于 65,536),那么您可以使用 16 位无符号整数。每个数字仅占用 2 个字节,因此占用的空间比 double 少 4 倍。您可以使用以下方法进行测试:
res = zeros(numel(index_neg)*numel(index_pos), 2, 'uint16')
最后,您可以使用 memory
命令了解 MATLAB 可用的内存量。
关于matlab - 网格网格的内存高效替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739564/