ベクトル があるとしVEC
ます。
MATLAB で指定された数値 NUM になるようにグループ化できるベクトル要素を見つける方法はありますか?
たとえばVEC = [2 5 7 10]
、NUM = 17
[2 5 10]
要求されたアルゴリズムは、サブベクトルと[7 10]
合計が与えられた の答えを提供する必要がありますNUM
。
ベクトル があるとしVEC
ます。
MATLAB で指定された数値 NUM になるようにグループ化できるベクトル要素を見つける方法はありますか?
たとえばVEC = [2 5 7 10]
、NUM = 17
[2 5 10]
要求されたアルゴリズムは、サブベクトルと[7 10]
合計が与えられた の答えを提供する必要がありますNUM
。
ツールボックスやサードパーティの機能を使わずにそれを行う別の方法を次に示します。の値のすべての可能な組み合わせをステップ実行し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
。
値のセットのすべての可能な組み合わせを取得する 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,:)
、出力をセル配列などに保存して、将来使用することもできます...
私が間違っていなければ、この問題は 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