"内存不足"用combvec函数为大量的向量MATLAB

时间:2017-01-08 01:19:42

标签: matlab combinations combinatorics large-data

所以我有一组与此类似的数据:

索引|参数A |参数B

1 | 1 | 3

2 | 1 | 5

3 | 1 | 1

4 | 2 | 12

5 | 2 | 15

6 | 2 | 41

7 | 3 | 22

8 | 3 | 14

9 | 3 | 9

我需要用不同的参数A计算参数B的所有可能组合,即(1)3-(2)12-(3)9并获得所述组合的指数,在这种情况下1-4-9 。我解决这个问题的方法是定义参数A变化的索引(在本例中为3和6,我应该指出它不是周期性的)并在循环中使用 combvec 函数:

  • combvec(combvec(1:3,4:6),6:9);

然后获得一个矩阵,其中包含每列中的所有组合索引,然后我可以使用它来获得参数B的组合。事情是列表太大了,因此内存不足问题。

这里的目标是计算每个参数序列B获得某个结果 - X - 然后选择最小化所述结果的组合。

我认为我可以将列表分成两部分,但问题是因为X依赖于所有A参数,两组的最小值不一定是全局最小值,所以我不太确定。

我认为另一种选择是尝试在循环中获取每个组合并立即计算X并且如果它小于前一次迭代则仅存储X.这个解决方案可以解决我的存储问题,但是我不太清楚如何在没有很多嵌套循环的情况下做到这一点,因为我无法使用 combvec

如果你们有任何关于如何解决这个问题或者如何解决我的建议以避免我提到的问题,我将不胜感激。

我提前感谢。

1 个答案:

答案 0 :(得分:0)

我在reddit上发布了这个问题并得到了回答,所以我要复制粘贴答案。推理与用户的建议非常相似:

A = 1:4;
B = 5:8;
C = 9:12;
D = 13:16;

AB = combvec(A,B); % 2x16
CD = combvec(C,D); % 2x16
ABCD = combvec(AB,CD); % 4x256
ABCD = combvec(combvec(combvec(A,B),C),D); % 4x256, same as above

ABCD嵌套组合变得非常快。相反,我们可以循环。

looped = [];
for idx=1:length(CD)
   looped = [looped [AB; repmat(CD(:,1),1,length(AB))]];
end

对于CD中的每种可能性,将其与所有AB可能性相结合。 “循环”与ABCD的结果相同。 我们可以测试最小值,而不是将每个组合存储在循环中 这种方法只需要内存中的64个值而不是1024个。

归功于/ u / BCPull

原帖子链接:https://www.reddit.com/r/matlab/comments/5mo48r/out_of_memory_problem_with_combvec_function_for_a/

不幸的是,由于用户烧杯建议我需要重新考虑我的方法,因为交换存储处理时间会占用大量的计算时间,而且一般来说这不是一个好主意。