pythonの返値をmatlabで表現
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentare
Kojiro Saito
am 1 Feb. 2023
Pythonのクラスではプロパティにsister_valがありますが、MATLABのBodyLinkクラスでoya_val となっていますが、MATLABのほうもsister_valにしなくて良いのでしょうか?
Akzeptierte Antwort
Kojiro Saito
am 2 Feb. 2023
Bearbeitet: Kojiro Saito
am 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
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Biomechanics finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!