2

ベクトル があるとしVECます。

MATLAB で指定された数値 NUM になるようにグループ化できるベクトル要素を見つける方法はありますか?

たとえばVEC = [2 5 7 10]NUM = 17

[2 5 10]要求されたアルゴリズムは、サブベクトルと[7 10]合計が与えられた の答えを提供する必要がありますNUM

4

3 に答える 3

3

ツールボックスやサードパーティの機能を使わずにそれを行う別の方法を次に示します。の値のすべての可能な組み合わせをステップ実行しVEC、合計が に等しいかどうかをテストしNUMます。

VEC = [2 5 7 10]
NUM = 17;
n = length(VEC);
for i = 1:(2^n - 1)
    ndx = dec2bin(i,n) == '1';
    if sum(VEC(ndx)) == NUM
        VEC(ndx)
    end
end

ans =
     7    10
ans =
     2     5    10

これはナタンの答えに似ていますが、を使用していませんconbntns

于 2013-02-13T14:46:23.480 に答える
3

値のセットのすべての可能な組み合わせを取得する Mapping Toolbox の関数であるを使用してこれを解決する方法を次にconbntns示します (このツールボックスがない場合は、FEX のコンビネーターを使用できます)。したがって、たとえば vectorAの場合、指定された長さ (1 から の長さA) のすべての可能な組み合わせを見つけてから、それらを合計してどれが に等しいかを確認しNUM=17ます。

NUM=17;
A=[2 5 7 10];
for ii=1:numel(A)
    B=combntns(A,ii);
    C=sum(B,2);
    D=find(C==NUM);
    if ~isempty(D)
        B(D,:)
    end
end

ans =
     7    10
ans =
     2     5    10

もちろんB(D,:)、出力をセル配列などに保存して、将来使用することもできます...

于 2013-02-13T08:19:08.320 に答える
2

私が間違っていなければ、この問題は NP 困難です。
しかし、興味深いアプローチは以下を使用している可能性がありますbintprog:

n = numel( VEC );
x0 = zeros( 1, n ); % one possible init guess
x = bintprog( zeros( n, 1 ), ...  % objective function meaningless, we look for feasibility
              [], [], ... % no inequality constraints
              VEC(:)', NUM, ... %' we want the sum of selected elements to equal NUM
              x0 ); % changing init x0 might result with different solutions
find( x ) 

バイナリ ベクトルx( の最適化の解bintprog) は、合計する関連要素を選択します。NUM

于 2013-02-13T08:37:45.707 に答える