problem with combvec, allcomb
14 views (last 30 days)
Show older comments
How to use combvec for a huge set (a1 to a100)?
Example a1=[1 3 4], a2=[5 7], a3=[7 9 1], .... a100=[8 9 6 2]
5 Comments
Walter Roberson
on 9 Nov 2012
The number of results you will get will be the product of the number of elements in the sets. That could be quite a lot!!
Answers (2)
Andrei Bobrov
on 10 Nov 2012
Edited: Andrei Bobrov
on 11 Nov 2012
a = {1,3,[2 6 4],[8 9]};
c = cell(size(a));
[c{:}] = ndgrid(a{end:-1:1});
c2 = sortrows(cell2mat(cellfun(@(x)x(:),c,'un',0)),1);
out = fliplr(c2)';
ADD
n = cellfun(@numel,a);
t = max(n)./n;
while any(rem(t,1) ~= 0)
t = t*2;
end
c = cellfun(@(x,y)repmat(x,1,y),a,num2cell(t),'un',0);
out = cat(1,c{:});
3 Comments
Rik
on 2 Mar 2022
combvec全组合
(machine translation of the Chinese characters: "full combination")
Matt Fig
on 9 Nov 2012
This will solve your problem.
function M = expand_vects(A)
% A is a cell array of 1-by-n vectors where n need not
% be the same in every element.
L = cellfun('length',A);
B = lcms(L);
M = zeros(length(L),B);
for ii = 1:length(L)
M(ii,:) = reshape(A{ii}(ones(1,B/L(ii)),:).',1,B);
end
Once you have the files in place, call like this:
>> A = {1,3,[2,6,4],[8,9]}; % Use a cell array
>> M = expand_vects(A)
M =
1 1 1 1 1 1
3 3 3 3 3 3
2 6 4 2 6 4
8 9 8 9 8 9
2 Comments
Matt Fig
on 9 Nov 2012
You can forgo the FEX function and just use this. (I found that recursively calling LCM is just as fast or faster than the FEX function.)
function M = expand_vects(A)
% A is a cell array of 1-by-n vectors where n need not
% be the same in every element.
L = cellfun('length',A);
LC = length(L);
% B = lcms(L); % Available on the FEX. Or use below loop.
B = L(1);
for ii = 2:LC
B = lcm(B,L(ii));
end
M = zeros(LC,B);
L = B./L;
for ii = 1:LC
M(ii,:) = reshape(A{ii}(ones(1,L(ii)),:).',1,B);
end
Matt Fig
on 10 Nov 2012
Well.....
Simply make yourself a cell array and pass it in:
a1 = 1;
a2 = 3;
a3 = [3 4 5];
A = {a1,a2,a3};
Nasty problems like this are the reason we don't make variables a1,a2,a3,a4.....an in the first place.....
See Also
Categories
Find more on Loops and Conditional Statements 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!