2013-02-13 1 views
2

벡터 VEC을 고려해 보겠습니다.MATLAB에서 특정 숫자를 합한 벡터 요소 찾기

어떤 벡터 요소를 그룹화 할 수 있는지 찾는 방법은 이므로 MATLAB에서 주어진 숫자 NUM까지 합한 것입니까? 요구 된 알고리즘은 주어진 NUM[2 5 10][7 10] 합 심볼 벡터를 해답을 제공한다 VEC = [2 5 7 10]NUM = 17

예를 들어

.

+0

작은 벡터에 대한 솔루션을 찾고 계십니까? 아니면 긴 벡터에도 사용할 필요가 있습니까? (수천 개의 요소?) –

+0

알고리즘이 10에서 50까지의 요소를 포함하는 벡터에 대해 작동하면 도움이 될 것입니다. –

+0

그런 경우 사용자의 요구를 재고하고 싶을 수 있습니다. 이미 예상 했겠지만 길이가 50 인 벡터의 경우 결과 수가 10^14를 초과 할 수 있습니다. 아마도 몇 가지 결과 만 필요하겠습니까? –

답변

3

conbntns은 가능한 모든 조합의 값을 검색하는 매핑 도구 상자의 기능을 사용하여이 문제를 해결하는 방법입니다 (이 도구 상자가없는 경우 FEX의 combinator을 사용할 수 있음). 그래서, 벡터 A, 예를 들어, 우리는 그 (A의 길이 1) 주어진 길이의 가능한 모든 조합을 찾기를 요약하고 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,:)을 셀 배열에 저장하면 나중에 사용할 수 있습니다 ...

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

+0

+1, 매우 좋은 접근'bintprog' ... – bla

+0

실제로 아주 좋은 접근 방법이지만, 이해할 수있는 모든 가능한 솔루션을 제공 할 수는 없습니다 (예를 들어, 주어진 예제에서 두 가지 가능한 해결책, 즉 [7 10] 및 [2 5 10]). 내가 잘못? –

+0

@ApostolosMilioudis - 정확합니다. 'bintprog'는 단일 솔루션만을 검색합니다. 그러나이 문제는 NP 완료이므로 O (2^n)보다 더 빨리 해결책을 찾을 수 있습니다 ... – Shai

3

에 합계 관련 요소를 선택 도구 상자 또는 타사 기능. VEC의 가능한 모든 값 조합을 단계별로 설명하고 sum이 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 

natan's answer 유사하지만, conbntns를 사용하지 않고.

+0

[i를 변수로 사용하지 마십시오] (http://stackoverflow.com/questions/) 14790740/using-i-and-j-as-variables-in-matlab) matlab에 – Shai

+0

나는 항상 그렇게한다. 나는 "i"를 허수로 사용하지 않습니다. [속도와 견고성을 위해 복잡한 i와 j를 1i로 바꿀 수 있습니다.] (http://www.mathworks.com/help/matlab/ref/i).html) – shoelzer

+0

@Shai 귀하가 링크 한 질문에 대한 응답으로 저의 주장을 게시했습니다. – shoelzer