2012-11-08 36 views
13

Tôi có một mảng được xác định trước là 20 vị trí tương ứng với 20 khớp ra khỏi cơ thể của tôi. Các khớp được đánh dấu bằng các giá trị chuỗi (ví dụ: 'left_knee', 'head', 'left_eye', v.v.).Matlab - Lập chỉ mục một mảng bằng cách sử dụng các giá trị chuỗi

Tôi muốn tham chiếu đến một giá trị nhất định trong mảng bằng cách sử dụng giá trị chuỗi được đính kèm. Ví dụ tôi muốn lưu trữ vị trí của các khớp được quan sát. Ban đầu tất cả các vị trí trong mảng là (-1 , -1) và sau đó nếu tôi phát hiện ra một khớp nào đó tôi muốn làm một cái gì đó như Joints('left_knee') = [100 200].

Làm cách nào tôi có thể thực hiện việc này trong Matlab?

Trả lời

9

Bạn có thể sử dụng được xây dựng trong map containers để ánh xạ giá trị cho các khóa duy nhất. Dưới đây là một ví dụ nhanh dành cho bạn:

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 

Bạn có thể nhận các giá trị/phím của đối tượng bản đồ như sau:

values(Joints) 

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

keys(Joints) 

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

Xem documentation để biết thêm 'ví dụ và làm thế nào để'.

14

Làm thế nào về struct s?

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

Nhận tất cả các lĩnh vực với fieldnames, hãy tham khảo mục cá nhân tự động như sau:

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

vv Nếu bạn tình cờ có nhiều khớp, tất cả cần phải cùng một loại dữ liệu nhưng tất cả đều thuộc về cùng một hệ thống, bạn có thể làm cho cấu trúc đa-D, quá:

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]; 

Chỉ cần để cho bạn thấy một số kỹ thuật hữu ích trong bối cảnh của cấu trúc đa-D:

>> 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 

Nhập help struct để biết thêm thông tin và tìm hiểu về các chức năng liên quan.

+0

+1 Tốt, tôi không biết bạn có thể tham khảo các trường cấu trúc bằng biến chuỗi. –

2

Để mở rộng giải pháp @RodyOldenhuis, bạn cũng có thể lưu trữ các chỉ mục của mình trong một mảng cấu trúc và sử dụng ma trận đơn giản cho dữ liệu. Bằng cách này, bạn vẫn có thể áp dụng hoạt động ma trận bình thường cho tất cả các vectorwise dữ liệu:

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,:) 

Trong ví dụ của tôi, tôi thiết lập một cấu trúc dữ liệu cho vị trí và vận tốc của 4 khớp ở mức 8 điểm trong thời gian để minh họa kỹ thuật của tôi.

Tôi thấy điều này dễ làm việc hơn khi sử dụng bộ dữ liệu đa chiều. Tất nhiên nó phụ thuộc vào ứng dụng của bạn, nếu bạn ví dụ chỉ muốn lưu trữ các hằng số, giải pháp @RodyOldenhuis 'rõ ràng là đơn giản hơn nhiều.

Các vấn đề liên quan