벡터 VEC
을 고려해 보겠습니다.MATLAB에서 특정 숫자를 합한 벡터 요소 찾기
어떤 벡터 요소를 그룹화 할 수 있는지 찾는 방법은 이므로 MATLAB에서 주어진 숫자 NUM까지 합한 것입니까? 요구 된 알고리즘은 주어진 NUM
에 [2 5 10]
및 [7 10]
합 심볼 벡터를 해답을 제공한다 VEC = [2 5 7 10]
및 NUM = 17
예를 들어
.
벡터 VEC
을 고려해 보겠습니다.MATLAB에서 특정 숫자를 합한 벡터 요소 찾기
어떤 벡터 요소를 그룹화 할 수 있는지 찾는 방법은 이므로 MATLAB에서 주어진 숫자 NUM까지 합한 것입니까? 요구 된 알고리즘은 주어진 NUM
에 [2 5 10]
및 [7 10]
합 심볼 벡터를 해답을 제공한다 VEC = [2 5 7 10]
및 NUM = 17
예를 들어
.
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,:)
을 셀 배열에 저장하면 나중에 사용할 수 있습니다 ...
이 문제는 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
에 합계 관련 요소를 선택 도구 상자 또는 타사 기능. 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
를 사용하지 않고.
[i를 변수로 사용하지 마십시오] (http://stackoverflow.com/questions/) 14790740/using-i-and-j-as-variables-in-matlab) matlab에 – Shai
나는 항상 그렇게한다. 나는 "i"를 허수로 사용하지 않습니다. [속도와 견고성을 위해 복잡한 i와 j를 1i로 바꿀 수 있습니다.] (http://www.mathworks.com/help/matlab/ref/i).html) – shoelzer
@Shai 귀하가 링크 한 질문에 대한 응답으로 저의 주장을 게시했습니다. – shoelzer
작은 벡터에 대한 솔루션을 찾고 계십니까? 아니면 긴 벡터에도 사용할 필요가 있습니까? (수천 개의 요소?) –
알고리즘이 10에서 50까지의 요소를 포함하는 벡터에 대해 작동하면 도움이 될 것입니다. –
그런 경우 사용자의 요구를 재고하고 싶을 수 있습니다. 이미 예상 했겠지만 길이가 50 인 벡터의 경우 결과 수가 10^14를 초과 할 수 있습니다. 아마도 몇 가지 결과 만 필요하겠습니까? –