2016-02-03 13 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 
... 

मुझे क्या करना चाहते है निकालने उप मैट्रिक्स जहां पहले और दूसरे स्तंभ में मानों बांटा जा सकता है ऐसी है कि:

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 –

+0

क्षमा करें, गलत टाइप करें, मैं इसे सही कर दूंगा। –

+1

क्या आप इनपुट डेटा पहले से ही इस तरह से सॉर्ट किया गया है कि आपके उप मैट्रिक्स मूल मैट्रिक्स में ब्लॉक जुड़े हुए हैं? क्या आप कई उप मैट्रिस के साथ समाप्त हो जाएंगे या आपकी समस्या का बड़ा इनपुट डेटा होगा? – Daniel

उत्तर

12

यह आसानी से unique और accumarray साथ किया जाता है:

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

बहुत अच्छा समाधान! –

+0

@MatthiasW। धन्यवाद! आमतौर पर 'accumarray' के साथ समाधान हैं :-) –

+0

आप मैट्रिक्स में समूहों को खोजने के लिए अद्वितीय के स्थान पर' findgroups' का भी उपयोग कर सकते हैं। 'u = findgroups (एम (:, 1), एम (:, 2)); और बाकी वही रहेगा। –

संबंधित मुद्दे