Find the Minimum Combination of Sum

17 views (last 30 days)
MarshallSc
MarshallSc on 19 Jan 2022
Commented: MarshallSc on 19 Jan 2022
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 Comments
MarshallSc
MarshallSc on 19 Jan 2022
Thanks for your reply. Yes, I want the minimum absolute value which is the closest combination to zero.

Sign in to comment.

Accepted Answer

Voss
Voss on 19 Jan 2022
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);
0.0041
% occurs at this row of A:
disp(idx);
17
% using these elements of A:
disp(A(idx+(-d:d)));
0.8604 0.8003 0.0643
% with this way of combining the elements:
disp(signs(:,comb_type(idx)));
1 -1 -1

More Answers (1)

Jon
Jon on 19 Jan 2022
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 Comments
MarshallSc
MarshallSc on 19 Jan 2022
Thank you sir, this method is very useful.

Sign in to comment.

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!