2016-04-07 9 views
0

これは明らかな質問かもしれませんが、私は初心者のコーダーであり、私が得ることができるリンクやアドバイスを感謝します。イベント複数の電卓/ジェネレータ? - MatLab

発生する可能性のあるイベントの数に基づいて値を持つ行列を生成するコードを作成しようとしています。

私はそれぞれのエンドメンバーを考慮しています。私は独立したイベントを持っています(これは、化学におけるエンドメンバーミキシングシナリオに適用されています)。これらのイベントは、それぞれ2つの異なる方法で発生する可能性があります(値は負または正のいずれでもよい)。私はまた、このコードが任意の数の独立したイベントを実行できるようにしようとしています。私はこの行列があると思っています、ncol =独立したイベントの数、そしてnrows =イベントの倍数です。

例:3つの独立したイベント(マトリックスに3つの列)があり、それぞれ2つの可能な発生(肯定または否定)があると、8つのイベントの倍数または組み合わせ(行列の8つの行)があることを意味します。

各組み合わせ(行)に対して、値が正であることを示すために「1」を、負であることを示すために「-1」を使用すると、結果を自動的に生成したいと思います。行の組み合わせの順序は重要ではありません。

残念ながら私はMatLab R2015aを使用していますが、MatLab R2016aでは「combnk」または「combntns」と呼ばれる機能に似ていると思っていました。

% Beginning of code: 
    NoIndEvents = 3; % Number of independent events 
    NoOccur  = 2; % Number of occurrences for each ind. event 
    newmatrix = ones(NoOccur^NoIndEvents,NoIndEvents); % Initialize matrix 

    % Have no idea how to generate this part... 

    % My desired output (no hard coding & easily modified for any 
    % number of columns/ ind. events) 

    newmatrix = 
     1 1 1 
     -1 -1 -1 
     1 1 -1 
     1 -1 1 
     -1 1 1 
     -1 -1 1 
     -1 1 -1 
     1 -1 1 

誰でもこの機能を使用できますか?私はこれが超簡単かもしれないという気持ちがあり、私はちょうどそれのコーディングの面に私の脳を包むことができません...

ありがとうございます! 〜シドニー

答えて

0

問題は、彼らが十分な組み合わせを生成しないようになどnchoosekcombnkは、(すなわち[-1 -1 1][1 -1 -1]と同じである)の結果の順序を考慮していないということです。入力のすべての順列を生成することができます(それぞれの可能な値はNoIndEvents回重複しています)。結果の最初のNoIndEvents列にuniqueを使用して、すべての並べ替えを取得します。

P = perms(repmat([-1 1], NoIndEvents, 1)); 
out = unique(P(:,1:NoIndEvents), 'rows') 

    -1 -1 -1 
    -1 -1  1 
    -1  1 -1 
    -1  1  1 
    1 -1 -1 
    1 -1  1 
    1  1 -1 
    1  1  1 
+0

ありがとうございました!私もちょうど役に立つと思われるfileexchange上のcombinator.mを見つけました! – Syd26S