Get every possible combination of an array
2 views (last 30 days)
Show older comments
kanav prashar
on 26 Feb 2020
Commented: kanav prashar
on 26 Feb 2020
I have an array that contains n number of 1s and -1s for example:
[1 -1 1 -1 1 1 1 -1]
I'd like every possible combination of this array (like [1 - 1-1 1 1 1 1 -1] ect...)
I tried using perms, but perms has a limit of size 10 and I need to be able to do upto 32. Another thing about perms is I'll have repeating numbers (which I can remove with ease)
Accepted Answer
Benjamin Großmann
on 26 Feb 2020
Edited: Benjamin Großmann
on 26 Feb 2020
This could be a starting point:
clearvars, close all
clc
arr = [-1 1 -1 1 1 1 1 1 -1];
num_arr_elements = numel(arr);
% find the number of -1
num_minus_one = sum(arr == -1);
% get all possible positions of -1
idx = nchoosek(1:num_arr_elements, num_minus_one);
% Initialize the matrix of combinations with ones
out = ones(size(idx,1), num_arr_elements);
% Place the -1s on the idx position
for ii = 1:size(idx,1)
out(ii,idx(ii,:)) = -1;
end
Two more aspects:
- We have to get rid of this for loop
- Number of possible combinations is
with n: array length, s1: number of 1s and s2: number of -1s; for n = 32 and (worst case) s1=s2=16, we have an output array of size 9 x 601.080.390. Optimization is heavily needed or buy a lot of RAM.
4 Comments
Benjamin Großmann
on 26 Feb 2020
Edited: Benjamin Großmann
on 26 Feb 2020
You are welcome! As Steven said, the brute force method is mostly not optimal to solve a specific task. I am also interested in the underlying problem. Furthermore, I would propose to use a logical array, since you have "bitnumbers" and then solve the task using bit-operations.
More Answers (0)
See Also
Categories
Find more on Linear Algebra in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!