2012-11-08 5 views
13

मेरे पास 20 स्थिति की पूर्वनिर्धारित सरणी है जो मेरे शरीर से 20 संयुक्त रूप से मेल खाती है। जोड़ों को स्ट्रिंग मानों के साथ चिह्नित किया जाता है (उदा। 'Left_knee', 'head', 'left_eye', आदि)।मैटलैब - स्ट्रिंग मानों का उपयोग करके एक सरणी को अनुक्रमणित करना

मैं संलग्न स्ट्रिंग मान का उपयोग करके सरणी के भीतर एक निश्चित मान को संदर्भित करना चाहता हूं। उदाहरण के लिए मैं मनाए गए जोड़ों की स्थिति को स्टोर करना चाहता हूं। प्रारंभ में सरणी के भीतर की सभी स्थिति (-1 , -1) होती है और फिर यदि मैं एक निश्चित जोड़ को खोजता हूं तो मैं Joints('left_knee') = [100 200] जैसे कुछ करना चाहता हूं।

मैटलैब में मैं यह कैसे कर सकता हूं?

उत्तर

9

आप अद्वितीय कुंजी के मूल्यों को मैप करने के लिए अंतर्निहित map containers का उपयोग कर सकते हैं।/नक्शा वस्तु की कुंजी के रूप में निम्नानुसार

valueSet = {[-1, 1], [2, 3], [1,5], [1,8]}; 
keySet = {'left_knee', 'right_knee', 'left_eye', 'right_eye'}; 
Joints = containers.Map(keySet,valueSet); 
Joints('left_knee') 

ans = 
    -1  1 

आप मूल्यों को प्राप्त कर सकते हैं::

values(Joints) 

ans = 
    [1x2 double] [1x2 double] [1x2 double] [1x2 double] 

keys(Joints) 

ans = 
    'left_eye' 'left_knee' 'right_eye' 'right_knee' 

अधिक के लिए documentation 'उदाहरण और कैसे' देखें यहाँ आप के लिए एक त्वरित उदाहरण है।

14

कैसे struct एस?

Joints.left_knee = [100 200]; 
Joints.head  = [-1 -100]; 

, fieldnames साथ सभी क्षेत्रों जाओ गतिशील तो जैसे व्यक्तिगत प्रविष्टियों का संदर्भ लें:

someVar = 'left_eye'; 
Joints.(someVar) = [200 250]; 

आदि आप कई जोड़ों के लिए होता है, तो सभी डेटा के एक ही प्रकार की आवश्यकता होगी, लेकिन वे सभी के हैं एक ही सिस्टम, आप बहु-डी structs भी कर सकते हैं:

0:

Joints(1).left_knee = [100 200]; 
Joints(1).head  = [-1 -100]; 

Joints(2).left_knee = [200 450]; 
Joints(2).head  = [-10 -189]; 

Joints(3).left_knee = [-118 264]; 
Joints(3).head  = [+33 78]; 

बस आपको कुछ तकनीकों बहु-डी structs के संदर्भ में उपयोगी दिखाने के लिए

>> someVar = 'head'; 
>> Joints.(someVar)  % will be expanded cell-array, 1 entry for each dimension 
ans = 
    -1 -100 
ans = 
    -10 -189 
ans = 
    33 78 
>> [Joints.(someVar)] % will collect those data in regular array 
ans = 
    -1 -100 -10 -189 33 78 
>> {Joints.(someVar)} % will collect those data in cell array 
ans = 
    [1x2 double] [1x2 double] [1x2 double] 
>> [A,B,C] = deal(Joints.(someVar)); % will assign data to 3 separate vars 
A = 
    -1 -100 
B = 
    -10 -189 
C = 
    33 78 

अधिक जानकारी के लिए help struct टाइप करें और प्रासंगिक कार्यों के बारे में जानें।

+0

+1 अच्छा, मुझे नहीं पता था कि आप एक स्ट्रिंग चर के साथ संरचना फ़ील्ड का संदर्भ ले सकते हैं। –

2

@RodyOldenhuis समाधान का विस्तार करने के लिए, आप अपने इंडेक्स को स्ट्रक्चर सरणी में भी स्टोर कर सकते हैं और डेटा के लिए सादे मैट्रिक्स का उपयोग कर सकते हैं। इस तरह से आप अभी भी सभी डेटा vectorwise करने के लिए सामान्य मैट्रिक्स आपरेशन लागू कर सकते हैं:

idx.left_knee = 1; 
idx.right_knee = idx.left_knee + 1; 
idx.left_elbow = idx.right_knee+ 1; 
idx.right_elbow= idx.left_elbow+ 1; 

joint_pos = rand(4,8); 
t = linspace(0,1,8); 
joint_vel = diff(joint_pos,2)./diff(t); 

joint_vel(idx.right_knee,:) 

मेरे उदाहरण में मैं स्थिति और 4 जोड़ों के वेग के लिए एक डेटा संरचना 8 बिंदुओं पर समय में मेरे तकनीक वर्णन करने के लिए निर्धारित किया है।

मुझे बहु-आयामी डेटासेट का उपयोग करते समय काम करना आसान लगता है। बेशक यह आपके आवेदन पर निर्भर करता है, अगर आप उदाहरण के लिए केवल स्थिरांक स्टोर करना चाहते हैं, तो @RodyOldenhuis 'समाधान स्पष्ट रूप से बहुत आसान है।

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

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