2016-02-03 4 views
6

に基づいて行列を分割:MATLAB:私はこの形式の行列を扱っています複数の値

M = 
1 1 3 
1 1 1 
1 2 2 
1 2 1 
1 2 2 
2 1 5 
2 1 1 
2 2 3 
2 2 4 
2 2 2 
... 

私が何をしたいことは、第1および第2の列の値をグループ化することができるエキスのサブ行列であります

I = 
1 1 
1 2 
2 1 
2 2 
... 
:私は、私は可能なマトリックスを持っているか、このためのインデックス行列をと約ハード考えるようにしようとしている

M1 = 
1 1 3 
1 1 1 

M2 = 
1 2 2 
1 2 1 
1 2 2 

M3 = 
2 1 5 
2 1 1 

... 

:ようインデックス作成に使用できる

私はそれを使用できるかどうか疑問に思っていたが、私は100%確実ではない。私はforループを使用したくないです。なぜなら、行列がかなり大きくなり、複雑さの順序が非常に大きくなる可能性があるからです。

ありがとうございます!

+1

"1番目と2番目のマトリックスの値が同じであるサブマトリックス"とはどういう意味ですか? M1!= M2 –

+0

申し訳ありませんがミスタイプですが修正いたします。 –

+1

サブマトリクスが元のマトリクスのブロックに接続されている方法で入力データが既にソートされていますか?あなたは多くのサブ行列で終わるのか、それともあなたの大きな入力データですか? – Daniel

答えて

12

これは、簡単にuniqueaccumarrayで行われます。

M = [ 1 1 3 
     1 1 1 
     1 2 2 
     1 2 1 
     1 2 2 
     2 1 5 
     2 1 1 
     2 2 3 
     2 2 4 
     2 2 2 ]; %// data 
[~, ~, u] = unique(M(:,1:2), 'rows'); %// unique labels of rows based on columns 1 and 2 
M_split = accumarray(u(:), (1:size(M,1)).', [], @(x){M(sort(x),:)}); %'// group rows 
                    % // based on labels 

これは、部分行列を含むcell arrayを与えます。あなたの例では、

M_split{1} = 
    1  1  3 
    1  1  1 
M_split{2} = 
    1  2  2 
    1  2  1 
    1  2  2 
M_split{3} = 
    2  1  5 
    2  1  1 
M_split{4} = 
    2  2  3 
    2  2  4 
    2  2  2 
+0

非常に良い解決策! @MatthiasW。 –

+0

。ありがとう! 'accumarray'の解決法は通常:-) –

+0

行列のグループを見つけるためにuniqueの代わりに' findgroups'を使うこともできます。 'u = findgroups(M(:、1)、M(:、2));'と残りは同じままです。 –

関連する問題