2011-05-05 19 views
14

पर एक इंडेक्स के रूप में एक वेक्टर का उपयोग करें मैं डेटा को एन-आयामी सरणी (परिवर्तनीय आयाम आकार) में पढ़ने के लिए MATLAB फ़ंक्शन लिख रहा हूं। मुझे मैट्रिक्स में एक विशिष्ट बिंदु तक पहुंचने में सक्षम होना चाहिए (इसे लिखने या इसे पढ़ने के लिए, उदाहरण के लिए), लेकिन मुझे समय से पहले पता नहीं है कि कितने इंडेक्स निर्दिष्ट करना है।एक मैट्रिक्स

वर्तमान में मेरे पास current_point वेक्टर है जो मैं प्रत्येक इंडेक्स को निर्दिष्ट करने के लिए पुनरावृत्त करता हूं, और max_points वेक्टर जो सरणी के आकार को निर्दिष्ट करता है। तो, अगर उदाहरण के लिए मैं [1, 1, 1] से 1000-दर-15-बटा 3 आकार, max_points = [1000 15 3] की एक 3-आयामी सरणी, और current_point दोहराता [1000, 15, 3] करना चाहता था (->[1000, 1, 1] ->[1, 2, 1] ->[1000, 2, 1] - [1, 1, 1]> ...) । क्या मैं चाहता हूँ तो जैसे मैट्रिक्स के लिए एक सूचकांक के रूप में current_point फ़ीड है ऐसा करने में सक्षम होने के लिए:

output_matrix(current_point) = val 

लेकिन जाहिरा तौर पर output_matrix([1 2 3]) = val की तरह कुछ बस outputmatrix(1:3) = 30 सेट हो जाएगा। मैं सिर्फ डमी वैरिएबल का उपयोग नहीं कर सकता क्योंकि कभी-कभी मैट्रिक्स को 3 इंडेक्स, अन्य बार 4, अन्य बार 2 इत्यादि की आवश्यकता होगी, इसलिए वैरिएबल लम्बाई का वेक्टर वास्तव में मुझे यहां चाहिए। क्या इंडेक्स में पॉइंट्स के रूप में वेक्टर का उपयोग करने का कोई आसान तरीका है?

+0

को बदलने के लिए नहीं यह वह जगह है * अनिवार्य * http://stackoverflow.com/questions [कॉम्पैक्ट MATLAB मैट्रिक्स अनुक्रमण संकेतन] (का डुप्लीकेट चाहिए/792683/कॉम्पैक्ट-मैटलैब-मैट्रिक्स-इंडेक्सिंग-नोटेशन), हालांकि शायद यह प्रश्न उस मामले से थोड़ा सा सरल है। – gnovice

+0

मुझे पता था कि इससे पहले पूछा जाना चाहिए था, लेकिन इसे मेरे डुप्ली प्लगइन से नहीं मिला। मुझे लगता है कि मैं उत्तर को रहने दूंगा, क्योंकि प्रश्न शीर्षक दूसरे की तुलना में अधिक प्रत्यक्ष है और खोजना आसान हो सकता है। – abcd

+0

मुझे लगा कि यह किसी बिंदु पर पूछा जाना चाहिए था, लेकिन खिताब से मैं कुछ भी नहीं देख रहा था। आप दोनों लोगों के अच्छे जवाब। मैंने सोचा कि ऐसा कुछ आसान होगा। – Paul

उत्तर

17
के रूप में प्रदान कर सकते हैं रैखिक सूचकांक लगता है

बनाने के लिए sub2ind फ़ंक्शन का उपयोग करके इस समस्या का सामान्य समाधान है, जैसा कि इस closely-related question में दिखाया गया है। sub2ind पर कॉल करने के बजाय आप compute a linear index yourself भी कर सकते हैं।

हालांकि, आपके मामले से जुड़े अन्य प्रश्नों की तुलना में आपका मामला सरल हो सकता है। यदि आप केवल एकल पॉइंट को अपने current_point वेक्टर के साथ इंगित कर रहे हैं (यानी।यह आपके एन-आयामी मैट्रिक्स में सबस्क्रिप्ट का सिर्फ एक एन-एलिमेंट वेक्टर है), तो आप एक सरल समाधान का उपयोग कर सकते हैं जहां आप current_point को num2cell फ़ंक्शन का उपयोग करके सबस्क्रिप्ट की सेल सरणी में कनवर्ट करते हैं और comma-separated list इंडेक्स बनाने के लिए इसका उपयोग करते हैं। उदाहरण के लिए:

current_point = [1 2 3 ...];  % A 1-by-n array of subscripts 
subCell = num2cell(current_point); % A 1-by-n cell array of subscripts 
output_matrix(subCell{:}) = val; % Update the matrix point 

आपरेशन subCell{:}subCell{1}, subCell{2}, ... टाइपिंग, जो current_point(1), current_point(2), ... टाइपिंग के बराबर है के बराबर पैदा करता है।

3

आप सबस्क्रिप्ट से रैखिक अनुक्रमणिका प्राप्त करने के लिए sub2ind फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण:

A=magic(4) 

A = 

    16  2  3 13 
    5 11 10  8 
    9  7  6 12 
    4 14 15  1 

selectElement={2,3}; %# get the element at position 2,3 in A. 
indx=sub2ind(size(A),selectElement{:}); 
A(indx) 

ans = 

    10 

उपरोक्त उदाहरण में, मैं एक cell रूप सबस्क्रिप्ट (आयाम के किसी भी संख्या हो सकता है) संग्रहीत किया है। यदि आपने इसे वेक्टर के रूप में संग्रहीत किया है, तो इसे सेल में बदलने के लिए बस num2cell() का उपयोग करें।

अब आप A(indx)=value; के रूप में आसानी से एक मान असाइन कर सकते हैं। मैंने उत्तर सामान्य रखने के लिए आपके से अलग-अलग चर का उपयोग किया है, लेकिन विचार वही है और आपको केवल चर नामों को प्रतिस्थापित करने की आवश्यकता है।

आपने अपनी पोस्ट में भी उल्लेख किया है कि आप (1,1,1) से कुछ मूल्य, (1000,15,3) तक लूपिंग कर रहे हैं और इन बिंदुओं में से प्रत्येक को मान निर्दिष्ट कर रहे हैं। यदि आप कॉलम के साथ लूपिंग कर रहे हैं, तो आप इस पूरे ऑपरेशन को वेक्टरकृत समाधान के साथ बदल सकते हैं।

finalElement={1000,15,3} लूप का अंतिम चरण बनें। पहले की तरह, के रूप में

index=sub2ind(size(A),finalElement{:}); 

अब अगर आप ये मान पाश एक एकल वेक्टर, values के रूप में जमा में आवंटित है, तो आप बस इसे एक ही चरण में

A(1:index)=values; 
10

मुझे पता है कि यह बहुत देर हो चुकी है लेकिन किसी के लिए जो इस विषय को पायेगा। मेरे लिए काम करने का सबसे आसान तरीका उपयोग करना है: diag(A (x(:),y(:)));

दुर्भाग्य से इस ही काम करता है अगर आप, मैट्रिक्स से मूल्यों को प्राप्त करने के लिए मूल्यों

+2

क्या आप इसे और समझा सकते हैं, मैं इसे समझ नहीं पा रहा हूं लेकिन ऐसा लगता है कि यह एक अच्छा और सरल समाधान हो सकता है – Leo

+0

बहुत बढ़िया ... सही काम करता है! +1 – bluebox