2010-12-28 6 views
6

मुझे आश्चर्य है कि फ़ंक्शन का उपयोग MxN मैट्रिक्स को उसी कॉलम आकार, N के साथ 10 सबमिटर में विभाजित करने के लिए संभव है, और लगभग उसी पंक्ति आकार ~M/10? यदि mod(M, 10) == 0 तो सभी सबमिशन के समान आकार होंगे, अन्यथा कुछ matrices +/- 1 पंक्ति होगी। क्या यह mat2cell फ़ंक्शन के माध्यम से संभव है?मैं एक मैट्रिक्स को असमान रूप से आकार देने वाले सबमिशन में कैसे विभाजित कर सकता हूं?

संदर्भ के लिए

, अगर पंक्ति आकार हैं सभी एक ही यह काफी सीधा है, जैसा कि यहां बताया:
How to divide a matrix into equals parts?

उत्तर

5

यहाँ कार्यों linspace, round का उपयोग कर एक सरल उपाय है, और diff है यह दृष्टिकोण सेल सरणी के परिणामी कोशिकाओं में एक और समान फैशन में अतिरिक्त पंक्तियों को वितरित करेगा। इन outputs है कि आप जब mat = magic(5); (बाएं) का उपयोग करके उपरोक्त लागू करने के मिल जाएगा और mat = magic(13); (दाएं) नोट:

cMat =    cMat = 

    [1x5 double]  [1x13 double] 
    [0x5 double]  [2x13 double] 
    [1x5 double]  [1x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [2x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [1x13 double] 
    [0x5 double]  [1x13 double] 
    [1x5 double]  [2x13 double] 
    [0x5 double]  [1x13 double] 

आप अतिरिक्त पंक्तियों की एक यादृच्छिक वितरण चाहते हैं, तो आप ऐसा तरह randperm उपयोग कर सकते हैं:

subSizes = diff(round(linspace(0, M, nSub+1))); 
cMat = mat2cell(mat, subSizes(randperm(nSub)), N); 
+0

+1 - मुझे लगता है कि यह जो मैंने प्रदान किया है उससे बेहतर है (जब तक कि कोई अतिरिक्त पंक्तियां सामने नहीं आतीं)। – sage

+0

@ ऋषि: MATLAB में कई समस्याओं के साथ, आमतौर पर कई समान समाधान होते हैं। यह सिर्फ एक बात है कि आप अतिरिक्त पंक्तियों को कहां चाहते हैं। ;) – gnovice

3

यह संभव है और लिंक आपके द्वारा दी गई के समान है, लेकिन आप जैसे आप चाहें यह निर्णय लेना होगा 'बचे हुए' पंक्तियों को विभाजित करने के लिए जब एम मोड 10 0 नहीं है और यदि आप 10 से कम पंक्तियों से शुरू होते हैं तो आप क्या करेंगे।

[M,N] = size(X); 
Y = mat2cell(X, [repmat(ceil(M/10),[1 mod(M,10)]) ... 
       repmat(floor(M/10),[1 10-mod(M,10)])], N);

अनुमान:

  1. आप> = 10 पंक्तियों होगा (या आप होने 0xN सरणियों कोई आपत्ति नहीं है)
  2. आप संतुष्ट हैं, तो सूचीबद्ध मान्यताओं मान्य हैं निम्नलिखित काम करना चाहिए पहले मैट्रिस के बीच विभाजित अतिरिक्त पंक्तियां - यानी यदि आपके पास 13 पंक्तियां हैं, तो आपके पास 2 पंक्तियों के साथ लगातार 3 मैट्रिस हैं, इसके बाद 1 पंक्ति के 7 मैट्रिस हैं।

उदाहरण के लिए, मैं इस एक्स पर = आंख भाग गया (7) और मिल गया:

[M, N] = size(mat); % Matrix size 
nSub = 10;   % Number of submatrices 
cMat = mat2cell(mat, diff(round(linspace(0, M, nSub+1))), N); 

:

Y = 
[1x7 double] 
    ... 
[1x7 double] 
[0x7 double] 
[0x7 double] 
[0x7 double] 
+0

आह, बहुत उपयोगी, धन्यवाद –

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

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