2013-06-24 5 views
6

मैटलैब में, हम इस तरह एक सरणी के आयामों के बीच संक्षिप्त कर सकते हैं:आयामों के एक विशिष्ट सेट में सरणी को कैसे पतन करें?

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

मुझे लगता है कि यह serialising बुलाया है या सपाट। तत्वों का क्रम पहले dim1 है, फिर dim2, फिर dim3 - तो आपको [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...] मिलता है।

लेकिन मुझे क्या करना चाहते हैं पतन है सिर्फ पहले दो आयामों के साथ:

mymatrix = M(:: , :); % something that works like this? 

एक 12 x 5 मैट्रिक्स देने के लिए। तो, उदाहरण के लिए, आप

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

मिल ताकि mymatrix के पहले आयाम "चपटा" 1 और मूल M के 2 आयाम, लेकिन किसी भी अन्य आयामों संरक्षण है।

मुझे वास्तव में 5-आयामी सरणी के "मध्यम 3 आयामों" के लिए ऐसा करने की आवश्यकता है, इसलिए एक सामान्य समाधान बहुत अच्छा होगा! जैसे W=rand(N,N,N,N,N); mymatrix = W(:, :::, :) को N x N^3 x N मैट्रिक्स देना चाहिए यदि आप देखते हैं कि मेरा क्या मतलब है।

धन्यवाद

उत्तर

5

उपयोग आयाम लंबाई तर्कों में से एक के लिए एक प्लेसहोल्डर के रूप में वर्ग कोष्ठक ([]) के साथ reshape:

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

या

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

प्लेसहोल्डर [] बताता reshape गणना करने के लिए स्वचालित रूप से आकार। ध्यान दें कि आप [] की केवल एक ही घटना का उपयोग कर सकते हैं। अन्य सभी आयाम लंबाई स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए।

+0

बिल्कुल सही धन्यवाद! Reshape के बारे में सोचना चाहिए था। पीएस मैंने बस काम करने के लिए एक और तरीका सोचा: 'tmp = permute (एम, [1,5,2,3,4]); ',' mymatrix = tmp (:, :)'। यकीन नहीं है कि यह हमेशा काम करेगा? बेशक 'reshape' ** ** ** ** बेहतर है। –

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