problem with combvec, allcomb

14 Ansichten (letzte 30 Tage)
zon
zon am 9 Nov. 2012
Kommentiert: Rik am 2 Mär. 2022
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 Kommentare
zon
zon am 9 Nov. 2012
Bearbeitet: Matt Fig am 9 Nov. 2012
Another example: a1=[1] a2=[3] a3=[2 6 4] a4=[8 9]. The required output is:
1 1 1 1 1 1
3 3 3 3 3 3
2 6 4 2 6 4
8 8 8 9 9 9
The order of cols. does not matter.
Walter Roberson
Walter Roberson am 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!!

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Andrei Bobrov
Andrei Bobrov am 10 Nov. 2012
Bearbeitet: Andrei Bobrov am 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 Kommentare
Andrei Bobrov
Andrei Bobrov am 11 Nov. 2012
Hi Matt! I added version (ADD).
Rik
Rik am 2 Mär. 2022
Comment posted as flag by @Hang Zhang:
combvec全组合
(machine translation of the Chinese characters: "full combination")

Melden Sie sich an, um zu kommentieren.


Matt Fig
Matt Fig am 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
Note that to use it you first need to get this file from the FEX.
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 Kommentare
Matt Fig
Matt Fig am 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
Matt Fig am 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.....

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by