pythonの返値をmatlabで表現
6 views (last 30 days)
Show older comments
pythonでかかれた以下のコードをmatlabで書きたいのですが,どのように書き直せばよいのかわかりません.特にResultant_Mass関数がかけません.どなたか教えていただきたいです.
class BodyLink:
def __init__(self, l_id:int, name, mass:float):
self.l_id = l_id # linkのID
self.name = name # linkの名前
self.mass = mass # linkの質量分配比
self.child_val = None # 子供の変数
self.sister_val = None # 兄弟姉妹の変数
# BodyLinkを一旦作成してから,その後に親子,兄弟姉妹関係をBodyLinkに与える.
def set_child_sister(self, child_val, sister_val):
self.child_val= child_val
self.sister_val = sister_val
# 合成の質量(全質量)の計算
# sister == 0 なら,部分解析(そのリンクの遠位側だけ計算)
# sister != 0 (例えば1)なら,全身解析(姉妹を含める)
# bw: 体重
def Resultant_Mass(self, bw, sister=0):
if self.l_id == 0:
return 0.0
elif sister == 0: # 部分(そこから遠位のみの)解析
return bw*self.mass + (self.child_val).Resultant_Mass(bw, sister)
else: # 全身解析
return (bw*self.mass +(self.child_val).Resultant_Mass(bw, sister) +
(self.sister_val).Resultant_Mass(bw, sister))
b_link = [0] * 16 #配列の初期化
b_link[0]=BodyLink(0, '', .0) # 0のときストップ
b_link[1]=BodyLink(1, 'Hip', .187)
b_link[2]=BodyLink(2, 'Chest', .302)
b_link[3]=BodyLink(3, 'Head', .069)
b_link[4]=BodyLink(4, 'RUArm', .027)
b_link[5]=BodyLink(5, 'RFArm', .016)
b_link[6]=BodyLink(6, 'RHand', .006)
b_link[7]=BodyLink(7, 'LUArm', .027)
b_link[8]=BodyLink(8, 'LFArm', .016)
b_link[9]=BodyLink(9, 'LHand', .006)
b_link[10]=BodyLink(10, 'RThigh', .110)
b_link[11]=BodyLink(11, 'RShin', .051)
b_link[12]=BodyLink(12, 'RFoot', .011)
b_link[13]=BodyLink(13, 'LThigh', .110)
b_link[14]=BodyLink(14, 'LShin', .051)
b_link[15]=BodyLink(15, 'LFoot', .011)
# 親子関係と兄弟姉妹関係を下記でb_linkのchild_val, sister_valに追記
b_link[1].set_child_sister(b_link[2], b_link[0])
b_link[2].set_child_sister(b_link[3], b_link[10])
b_link[3].set_child_sister(b_link[0], b_link[4])
b_link[4].set_child_sister(b_link[5], b_link[7])
b_link[5].set_child_sister(b_link[6], b_link[0])
b_link[6].set_child_sister(b_link[0], b_link[0])
b_link[7].set_child_sister(b_link[8], b_link[0])
b_link[8].set_child_sister(b_link[9], b_link[0])
b_link[9].set_child_sister(b_link[0], b_link[0])
b_link[10].set_child_sister(b_link[11], b_link[13])
b_link[11].set_child_sister(b_link[12], b_link[0])
b_link[12].set_child_sister(b_link[0], b_link[0])
b_link[13].set_child_sister(b_link[14], b_link[0])
b_link[14].set_child_sister(b_link[15], b_link[0])
b_link[15].set_child_sister(b_link[0], b_link[0])
# b_link[1](ツリー構造の最上位)に対して計算することで,それ以下のツリーを計算.
# sister = 1で兄弟姉妹を含める.
# すなわち全リンク(全身)の質量を以下で計算する.
b_link[1].Resultant_Mass(86, sister=1)
###[出力結果] 86.0
# 4:右上腕以下(右腕全体)の質量を計算する.
# sister = 0で兄弟姉妹を含めない(左腕などを含めない).
b_link[4].Resultant_Mass(86, sister=0)
###[出力結果] 4.214
コンストラクタと,関数set_child_sisterはうまくいきました
classdef BodyLink
properties
id uint32
name
mass float
child_val
oya_val
end
methods
function obj = BodyLink(l_id,name,mass)
obj.id = l_id;
obj.name = name;
obj.mass = mass;
obj.child_val = "None";
obj.oya_val = "None";
end
function obj = set_child_sister(obj,child_val,oya_val)
obj.child_val = child_val;
obj.oya_val = oya_val;
end
end
end
2 Comments
Kojiro Saito
on 1 Feb 2023
Pythonのクラスではプロパティにsister_valがありますが、MATLABのBodyLinkクラスでoya_val となっていますが、MATLABのほうもsister_valにしなくて良いのでしょうか?
Accepted Answer
Kojiro Saito
on 2 Feb 2023
Edited: Kojiro Saito
on 2 Feb 2023
クラスをそのまま移植すると下記のような感じになります。
BodyLink.m
classdef BodyLink < handle
properties
id uint32
name
mass double
child_val
oya_val
end
methods
function obj = BodyLink(l_id,name,mass)
obj.id = l_id;
obj.name = name;
obj.mass = mass;
obj.child_val = "None";
obj.oya_val = "None";
end
function obj = set_child_sister(obj,child_val,oya_val)
obj.child_val = child_val;
obj.oya_val = oya_val;
end
function result = Resultant_Mass(obj, bw, sister)
if obj.id == 1
result = 0.0;
elseif sister == 0
result = bw*obj.mass + obj.child_val.Resultant_Mass(bw, sister);
else
result = bw*obj.mass + obj.child_val.Resultant_Mass(bw, sister) + ...
obj.oya_val.Resultant_Mass(bw, sister);
end
end
end
end
MATLABの配列は1始まりなので、0番目の要素を1番目になるようにしています。IDのプロパティは0始まりでも良いのですが、要素番号と同じにしたほうが見やすいと思い、IDも1始まりにしています。
b_link = cell(1, 16); %配列の初期化
b_link{1}=BodyLink(1, '', .0); % 0のときストップ
b_link{2}=BodyLink(2, 'Hip', .187);
b_link{3}=BodyLink(3, 'Chest', .302);
b_link{4}=BodyLink(4, 'Head', .069);
b_link{5}=BodyLink(5, 'RUArm', .027);
b_link{6}=BodyLink(6, 'RFArm', .016);
b_link{7}=BodyLink(7, 'RHand', .006);
b_link{8}=BodyLink(8, 'LUArm', .027);
b_link{9}=BodyLink(9, 'LFArm', .016);
b_link{10}=BodyLink(10, 'LHand', .006);
b_link{11}=BodyLink(11, 'RThigh', .110);
b_link{12}=BodyLink(12, 'RShin', .051);
b_link{13}=BodyLink(13, 'RFoot', .011);
b_link{14}=BodyLink(14, 'LThigh', .110);
b_link{15}=BodyLink(15, 'LShin', .051);
b_link{16}=BodyLink(16, 'LFoot', .011);
% 親子関係と兄弟姉妹関係を下記でb_linkのchild_val, sister_valに追記
b_link{2}.set_child_sister(b_link{3}, b_link{1});
b_link{3}.set_child_sister(b_link{4}, b_link{11});
b_link{4}.set_child_sister(b_link{1}, b_link{5});
b_link{5}.set_child_sister(b_link{6}, b_link{8});
b_link{6}.set_child_sister(b_link{7}, b_link{1});
b_link{7}.set_child_sister(b_link{1}, b_link{1});
b_link{8}.set_child_sister(b_link{9}, b_link{1});
b_link{9}.set_child_sister(b_link{10}, b_link{1});
b_link{10}.set_child_sister(b_link{1}, b_link{1});
b_link{11}.set_child_sister(b_link{12}, b_link{14});
b_link{12}.set_child_sister(b_link{13}, b_link{1});
b_link{13}.set_child_sister(b_link{1}, b_link{1});
b_link{14}.set_child_sister(b_link{15}, b_link{1});
b_link{15}.set_child_sister(b_link{16}, b_link{1});
b_link{16}.set_child_sister(b_link{1}, b_link{1});
% b_link{2}(ツリー構造の最上位)に対して計算することで,それ以下のツリーを計算.
% sister = 1で兄弟姉妹を含める.
% すなわち全リンク(全身)の質量を以下で計算する.
sister=1;
b_link{2}.Resultant_Mass(86, sister) %{出力結果} 86.0
% 4:右上腕以下(右腕全体)の質量を計算する.
% sister = 0で兄弟姉妹を含めない(左腕などを含めない).
sister=0;
b_link{5}.Resultant_Mass(86, sister) %{出力結果} 4.214
More Answers (0)
See Also
Categories
Find more on Biomechanics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!