pythonの返値をmatlabで表現

조회 수: 6 (최근 30일)
卓也
卓也 2023년 2월 1일
댓글: 卓也 2023년 2월 3일
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
Kojiro Saito
Kojiro Saito 2023년 2월 1일
Pythonのクラスではプロパティにsister_valがありますが、MATLABのBodyLinkクラスでoya_val となっていますが、MATLABのほうもsister_valにしなくて良いのでしょうか?
卓也
卓也 2023년 2월 1일
oya_valはpythonのsister_valに相当します.名前を変更しても特に支障はありません.

댓글을 달려면 로그인하십시오.

채택된 답변

Kojiro Saito
Kojiro Saito 2023년 2월 2일
편집: Kojiro Saito 2023년 2월 2일
クラスをそのまま移植すると下記のような感じになります。
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
卓也
卓也 2023년 2월 3일
ご回答いただきありがとうございます

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Biomechanics에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!