Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combinations from a given set without repetition

Tags:

matrix

matlab

Suppose I have a matrix defined as follows

M = [C1 C2 C3 C4]

Where the C's are column vectors I want some efficient (i.e. no for loops) way of producing A vector such that

ResultVec = [C1 C2; 
             C1 C3; 
             C1 C4;
             C2 C3; 
             C2 C4; 
             C3 C4]

Thanks in advance!

like image 618
David Avatar asked Dec 08 '22 10:12

David


2 Answers

That is, what nchoosek does:

M = [ 1 2 3 4 ];

R = nchoosek(M,2);

returns:

R =

     1     2
     1     3
     1     4
     2     3
     2     4
     3     4

I don't know if it's your intention but nchoosek is Matlabs implementation of The number of k-combinations from a given set S of n elements without repetition (Wikipedia)

The function nchoosek is performance wise not very efficient though. But there are equivalents on File Exchange, which are much(!!) faster and doing the same.


Just to make it clear, it's not just working for the fairly simple example above, and is not returning any indices. It directly transforms the matrix as desired.

M = [ 21 42 123 17 ];

returns:

R =

    21    42
    21   123
    21    17
    42   123
    42    17
   123    17
like image 146
Robert Seifert Avatar answered Dec 19 '22 18:12

Robert Seifert


This is the simplest way I've come up with:

n = size(M, 2);
[j, i] = ind2sub([n n], find(~triu(ones(n))));
ResultVec = M(:, [i j]);
ResultVec = reshape(ResultVec, [], 2)
like image 43
A. Donda Avatar answered Dec 19 '22 20:12

A. Donda