pythonの返値をmatlabで表現

7 views (last 30 days)
卓也
卓也 on 1 Feb 2023
Commented: 卓也 on 3 Feb 2023
pythonでかかれた以下のコードをmatlabで書きたいのですが,どのように書き直せばよいのかわかりません.特にResultant_Mass関数がかけません.どなたか教えていただきたいです.
class BodyLink:
def __init__(self, l_id:int, name, mass:float):
self.l_id = l_id # linkID
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_linkchild_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
卓也
卓也 on 1 Feb 2023
oya_valはpythonのsister_valに相当します.名前を変更しても特に支障はありません.

Sign in to comment.

Accepted Answer

Kojiro Saito
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
ans = 86
% 4:右上腕以下(右腕全体)の質量を計算する.
% sister = 0で兄弟姉妹を含めない(左腕などを含めない).
sister=0;
b_link{5}.Resultant_Mass(86, sister) %{出力結果} 4.214
ans = 4.2140
  1 Comment
卓也
卓也 on 3 Feb 2023
ご回答いただきありがとうございます

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!