Azzera filtri
Azzera filtri

Generating an "all-combinations" matrix for a given vector

1 visualizzazione (ultimi 30 giorni)
Hi,
Given a column vector with integer values, say x = [2;3;4], I would like to create a 3*24 matrix of the following form
Each column in A is created by selecting 1st, 2nd and 3rd elements of the corresponding column from sets {1,2}, {1,2,3} and {1,2,3,4}, respectively. Thus, 2*3*4=24 different columns can be generated using this approach to form matrix A.
I am aware that the number of columns in matrix A grows very fast with the size of vector x and numeric values of its elements. But I won't be working with examples of matrix A larger than 500 cloumns.
Thanks for your help,
-burak

Risposta accettata

Thorsten
Thorsten il 7 Nov 2016
x = [2 3 4];
n = prod(x);
for i = 1:numel(x)
li = []; for ii = 1:x(i), li = [li repmat(ii, [1 n/prod(x(1:i))])]; end,
A(i,:) = repmat(li, [1 n/numel(li)]);
end
  1 Commento
Burak
Burak il 7 Nov 2016
Modificato: Burak il 7 Nov 2016
This one works fine for my purpose. Thank you so much.

Accedi per commentare.

Più risposte (2)

Andrei Bobrov
Andrei Bobrov il 7 Nov 2016
Modificato: Andrei Bobrov il 8 Nov 2016
A = fullfact(x(end:-1:1));
A = flip(A,2)';
other way :)
x = [2 3 4]';
k = arrayfun(@(ii)1:ii,x(end:-1:1),'un',0);
[a,b,c] = ndgrid(k{:});
A = [c(:),b(:),a(:)]';

KSSV
KSSV il 7 Nov 2016
clc; clear all ;
v1 = [1 2] ;
v2 = [1 2 3] ;
v3 = [1 2 3 4] ;
%
dimensions = cellfun(@numel, {v1,v2,v3});
[i1,i2,i3] = ind2sub(dimensions, 1:prod(dimensions));
combinations = [v1(i1); v2(i2); v3(i3)]
  1 Commento
Burak
Burak il 7 Nov 2016
Thanks for the help. Though it works fine for the given instance,it requires to add a new i variable for each additional element in vector x.

Accedi per commentare.

Categorie

Scopri di più su Numeric Types in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by