2009-04-27 13 views
8

मुझे एन-बाय-के आकार का मैट्रिक्स मिला है, जिसमें प्रति पंक्ति के संख्याएं हैं। मैं इन के संख्याओं को इंडेक्स के रूप में के-आयामी मैट्रिक्स में उपयोग करना चाहता हूं। क्या MATLAB में ऐसा करने का कोई कॉम्पैक्ट तरीका है या क्या मुझे लूप का उपयोग करना चाहिए?कॉम्पैक्ट MATLAB मैट्रिक्स इंडेक्सिंग नोटेशन

यह है कि मैं क्या (MATLAB छद्म कोड में) क्या करना चाहते है, लेकिन एक और अधिक MATLAB-इश तरह से:

for row=1:1:n 
    finalTable(row) = kDimensionalMatrix(indexmatrix(row, 1),... 
      indexmatrix(row, 2),...,indexmatrix(row, k)) 
end 

उत्तर

15

आप पाश के लिए एक का उपयोग करने से बच चाहते हैं, यह शायद यह करने के लिए स्पष्ट तरीका है:

indexCell = num2cell(indexmatrix,1); 
linearIndexMatrix = sub2ind(size(kDimensionalMatrix),indexCell{:}); 
finalTable = kDimensionalMatrix(linearIndexMatrix); 

व्याख्या:

पहली पंक्ति indexmatrix के प्रत्येक स्तंभ डालता है का उपयोग कर सेल सरणी की अलग-अलग कोशिकाओं में। यह हमें एक समारोह है कि (प्रत्येक मैट्रिक्स तत्व 1 से एन, एन होने के गिने है रैखिक सूचकांक में subscripted सूचकांक (पंक्ति, कॉलम, आदि) में कनवर्ट करता SUB2IND में एक comma-separated list के रूप में सभी कश्मीर कॉलम पारित करने के लिए अनुमति देता है मैट्रिक्स में तत्वों की कुल संख्या)। अंतिम पंक्ति आपके लूप को प्रतिस्थापित करने के लिए इन रैखिक सूचकांक का उपयोग करती है। मैट्रिक्स इंडेक्सिंग (सबस्क्रिप्ट, रैखिक, और तार्किक) के बारे में एक अच्छी चर्चा here मिल सकती है। सोचा के लिए

कुछ अधिक भोजन ...

प्रवृत्ति vectorized समाधान के पक्ष में छोरों के लिए से संकोच के लिए कुछ कई MATLAB उपयोगकर्ताओं (अपने आप को शामिल) के आदी हो गए हैं है। हालांकि, MATLAB हैंडल के नए संस्करण अधिक कुशलता से लूपिंग हैंडल करते हैं। जैसा कि this answer में किसी अन्य SO प्रश्न पर चर्चा की गई है, लूप के लिए उपयोग करने से कभी-कभी वेक्टर किए गए समाधान के साथ तेज़ी से चलने वाले कोड में परिणाम हो सकता है।

मैं निश्चित रूप से यह नहीं कह रहा हूं कि आपको अब अपने कोड को सदिश बनाने की कोशिश नहीं करनी चाहिए, केवल यह कि हर समस्या अद्वितीय है। वेक्टरिंग अक्सर अधिक कुशल हो, लेकिन हमेशा नहीं है। आपकी समस्या के लिए, वेक्टरकृत कोड बनाम लूप के लिए निष्पादन गति शायद इस बात पर निर्भर करेगी कि n और k मान कितने बड़े हैं।

6

अलग सबस्क्रिप्ट के रूप में वेक्टर indexmatrix(row, :) के तत्वों का इलाज करने के लिए, आप तत्वों की जरूरत है एक सेल सरणी के रूप में। इसलिए, जब आप कुछ इस तरह

subsCell = num2cell(indexmatrix(row, :)); 
finalTable(row) = kDimensionalMatrix(subsCell{:}); 

कर सकता है एक अल्पविराम से अलग-सूची के रूप में subsCell विस्तार करने के लिए, दुर्भाग्य से आप दो अलग-अलग लाइनों की जरूरत है। हालांकि, यह कोड k से स्वतंत्र है।

+0

बढ़िया! क्या आप इसे पंक्तियों की संख्या से भी स्वतंत्र कर सकते हैं? – AnnaR

+0

@AnnaR - मैंने अभी एक उत्तर पोस्ट किया है जो एक बार में 'indexmatrix' की सभी 'n' पंक्तियों को संभालता है। – Shai

0

एक hacky रास्ता

ksz = size(kDimensionalMatrix); 
cksz = cumprod([ 1 ksz(1:end-1)]); 
lidx = (indexmatrix - 1) * cksz' + 1; #' 
% lindx is now (n)x1 linear indices into kDimensionalMatrix, one index per row of indexmatrix 
% access all n values: 
selectedValues = kDimensionalMatrix(lindx); 

चीयर्स में रैखिक सूचकांक में अपने उप-सूचकांक कन्वर्ट!