2017-01-08 7 views
-1

このようなデータセットがあります:多数のベクトルのためのcombvec関数を持つ "メモリ不足" 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

Iは異なるパラメータでパラメータBのすべての可能な組み合わせを計算する必要がA、すなわち(1)3-(2)12-(3)この組み合わせの指標、この場合1-4-9を得る。

  • combvec(:私はこの時、パラメータAの変化(この場合は3と6で、私はそれが周期的でない指摘しなければならない)、ループ内combvec関数を使用するインデックスを定義した解決方法combvec(1:3,4:6)、6:9)。

Anが、私は、その後の事がリストされたパラメータBの組み合わせを取得するために使用できる、各列のすべての組み合わせのインデックスを持つ行列を得るには、それゆえ、今、メモリ問題のうち大きすぎます。

ここでの目的は、パラメータBの各シーケンスに対してある結果-X-を計算し、次にその結果を最小にする組み合わせを選択することです。

私はリストを2つに分けることができると考えましたが、問題はXがすべてのAパラメータに依存するためです。両方のグループの最小値が必ずしもグローバルな最小値になるわけではないため、

私が思ったもう1つの代替案は、ループ内の各組み合わせを取得し、直ちにXを計算し、以前の繰り返しよりも小さい場合はXだけを保存することでした。このソリューションは私のストレージの問題を解決するだろうが、私は使用することができないので入れ子になったループなしでこれを行う方法がわからないcombvec

あなたがこれを解決する方法や、私が言及した問題を回避する私の提案をどうやってくるかについてのアイディアがあれば、私は感謝します。

事前に感謝します。

+0

いくつかの代替案があります(http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors)。生成するコンビネーションの数はいくつですか? – beaker

+0

3e9の可能な組合せは約24GBを意味すると思います。 – jcarvalho

+1

一般に、多くの計算は、あなたのアプローチを再考する必要があるかもしれない大きな警告兆候です。あなたが*本当に**本当に** ***本当に***がそれをしなければならない場合、一つの安価な方法は、あなたの最大ベクトルをとり、 'combvec(1、b、c); combvec(2、b、c); combvec(3、b、c);など。これは一度に処理される組み合わせの数を最大のベクトルのサイズで除算するだけですが、それでも十分でしょう。反復的に組み合わせを生成することはできますが、***遅いです***。 – beaker

答えて

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可能性を組み合わせてください。 "looped"はABCDと同じ結果です。 ではなくループ内の各組み合わせを格納し、私たちは/ U/BCPull

オリジナルポストのリンクに代わり1024

クレジットのメモリ内の64個の値を必要な最小値 ためにこのアプローチをテストすることができます:https://www.reddit.com/r/matlab/comments/5mo48r/out_of_memory_problem_with_combvec_function_for_a/

残念なことに、ユーザーのビーカーが示唆しているように、処理時間のためにストレージを交換するには多くの計算時間がかかっていて、それは一般的には良い考えではないため、私のアプローチを再考する必要があります。