"Out of memory" 具有用于大量向量的 combvec 函数的 MATLAB
"Out of memory" with combvec function for a large number of vectors MATLAB
所以我有一组类似这样的数据:
索引|参数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
我需要计算参数 B 与不同参数 A 的所有可能组合,即 (1)3-(2)12-(3)9 并获得所述组合的索引,在本例中为 1-4 -9。我解决这个问题的方法是定义参数 A 变化的索引(在本例中为 3 和 6,我应该指出它不是周期性的)并在循环中使用 combvec 函数:
- combvec(combvec(1:3,4:6),6:9);
然后获得一个矩阵,其中每列中都有所有组合索引,然后我可以使用它来获得参数 B 的组合。问题是列表现在太大了,因此 Out of内存问题。
这里的objective是对每一个参数序列B进行计算,得到一定的结果-X-,然后选择使该结果最小的组合。
我以为我可以将列表一分为二,但问题是因为 X 依赖于所有 A 参数,所以两组中的最小值不一定是全局最小值,所以我不太确定。
我认为的另一种选择是尝试在循环中获取每个组合并立即计算 X 并且仅在 X 小于上一次迭代时才存储 X。这个解决方案将解决我的存储问题,但我不太确定如果没有大量嵌套循环如何做到这一点,因为我将无法使用 combvec.
如果你们对如何解决这个问题或如何提出我的建议来避免我提到的问题有任何想法,我将不胜感激。
提前致谢。
我在 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中的所有可能性结合起来。 "looped" 与 ABCD 的结果相同。
我们可以测试最小值,而不是将每个组合存储在循环中
这种方法只需要内存中的 64 个值而不是 1024 个。
归功于 /u/BCPull
原文Postlink:https://www.reddit.com/r/matlab/comments/5mo48r/out_of_memory_problem_with_combvec_function_for_a/
不幸的是,正如用户 beaker 所建议的那样,我需要重新考虑我的方法,因为用存储换取处理时间会占用大量计算时间,而且这通常不是一个好主意。
所以我有一组类似这样的数据:
索引|参数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
我需要计算参数 B 与不同参数 A 的所有可能组合,即 (1)3-(2)12-(3)9 并获得所述组合的索引,在本例中为 1-4 -9。我解决这个问题的方法是定义参数 A 变化的索引(在本例中为 3 和 6,我应该指出它不是周期性的)并在循环中使用 combvec 函数:
- combvec(combvec(1:3,4:6),6:9);
然后获得一个矩阵,其中每列中都有所有组合索引,然后我可以使用它来获得参数 B 的组合。问题是列表现在太大了,因此 Out of内存问题。
这里的objective是对每一个参数序列B进行计算,得到一定的结果-X-,然后选择使该结果最小的组合。
我以为我可以将列表一分为二,但问题是因为 X 依赖于所有 A 参数,所以两组中的最小值不一定是全局最小值,所以我不太确定。
我认为的另一种选择是尝试在循环中获取每个组合并立即计算 X 并且仅在 X 小于上一次迭代时才存储 X。这个解决方案将解决我的存储问题,但我不太确定如果没有大量嵌套循环如何做到这一点,因为我将无法使用 combvec.
如果你们对如何解决这个问题或如何提出我的建议来避免我提到的问题有任何想法,我将不胜感激。
提前致谢。
我在 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中的所有可能性结合起来。 "looped" 与 ABCD 的结果相同。 我们可以测试最小值,而不是将每个组合存储在循环中 这种方法只需要内存中的 64 个值而不是 1024 个。
归功于 /u/BCPull
原文Postlink:https://www.reddit.com/r/matlab/comments/5mo48r/out_of_memory_problem_with_combvec_function_for_a/
不幸的是,正如用户 beaker 所建议的那样,我需要重新考虑我的方法,因为用存储换取处理时间会占用大量计算时间,而且这通常不是一个好主意。