Find the Minimum Combination of Sum
조회 수: 12 (최근 30일)
이전 댓글 표시
I have a 100 x 1 vector with numeric values, what I want to find is the minimum combination of the reference point with the upper and lower indices for the equation below. For example:
A = rand(100,1);
%Lets say the reference point is A(31)
comb = +-A(31 + 1) +- A(31) +- A(31-1) % So there will be 2^3 scenarios
% When the reference point reaches index 100 (length of the vector), the operation stops
I want to find the absolute minimum combintation of all the possible combinations. Can a function be created to perform this operation since I need to perform this for multiple vectors in a for loop?
I'd appreciate it if someone can please help me, thank you!
댓글 수: 2
Voss
2022년 1월 19일
편집: Voss
2022년 1월 19일
For a given reference point, e.g., A(31), the minimum combination will be the one where all the numbers added together are negative (or zero), i.e., if A(32) is positive, then subtract it (i.e., pick "-"), if A(31) is negative, then add it (i.e., pick "+"), etc., so you'll always be adding three negative (or zero-valued) numbers. Is this what you want?
Or do you want the combination with the minimum absolute value, i.e., the combination closest to zero?
채택된 답변
Voss
2022년 1월 19일
N = 100;
window_size = 3;
A = rand(N,1);
signs = 1-2*(dec2bin(0:2^(window_size-1)-1,window_size)-'0').';
comb = NaN(N,1);
comb_type = NaN(N,1);
d = (window_size-1)/2;
for i = d+1:N-d
[comb(i),comb_type(i)] = min(abs(sum(A(i+(-d:d)).*signs)));
end
[min_comb,idx] = min(comb);
% minimum absolute-value sum:
disp(min_comb);
% occurs at this row of A:
disp(idx);
% using these elements of A:
disp(A(idx+(-d:d)));
% with this way of combining the elements:
disp(signs(:,comb_type(idx)));
댓글 수: 0
추가 답변 (1개)
Jon
2022년 1월 19일
If I understand what you are trying to do, I think this might work for you
A = rand(100,1);
% define matrix which can be multiplied by 3 elements to give all possible
% signed summations
c = [-1 -1 -1;-1 -1 1;-1 1 -1; -1 1 1;1 -1 -1;1 -1 1;1 1 -1; 1 1 1]
% loop through data
% not sure what you want to do about end points, so start and end on
% interior points
numPoints = numel(A)
result = zeros(numPoints-2,1); % preallocate array to hold result
for k = 2:numPoints-1
result(k) = min(abs(c*A(k-1:k+1)));
end
댓글 수: 2
Jon
2022년 1월 19일
Actually since you are taking the absolute value you actually only need the first 4 rows of c
참고 항목
카테고리
Help Center 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!