関数呼び出しに関するエラー

조회 수: 12 (최근 30일)
卓也
卓也 2023년 3월 19일
댓글: 卓也 2023년 3월 20일
file_nameが'sholder'の時は実行されるのですが,それ以外の時は「配列のサイズがこの演算に適合しません。」とエラーが出ます.
file_nameに'shoulder','elbow'を入力したときもプログラムが実行させるにはどこを変えるべきでしょうか
function markerdata = extract_marker(file_name,marker_name)
M = readmatrix(file_name);
M = fillmissing(M(6:end,3:end),"spline",1);
%名前に合わせてフレームごとのxyz座標を出力
if marker_name == 'shoulder'
markerdata = M(:,1:3);
elseif marker_name == 'elbow'
markerdata = M(:,10:12);
elseif marker_name =='wrist'
markerdata = M(:,19:21)
end
end
extract_marker('arm_right Cal 03','shoulder')%正常に実行される
extract_marker('arm_right Cal 03','wrist')%エラーが発生する

채택된 답변

Atsushi Ueno
Atsushi Ueno 2023년 3월 19일
> file_nameに'shoulder','elbow'を入力したときもプログラムが実行させるにはどこを変えるべきでしょうか
下記プログラムのコメント箇所を変更します
extract_marker('arm_right Cal 03',"shoulder"); % <======= 一重引用符を二重引用符に変更
extract_marker('arm_right Cal 03',"wrist"); % <======= 一重引用符を二重引用符に変更
function markerdata = extract_marker(file_name,marker_name)
M = readmatrix(file_name);
M = fillmissing(M(6:end,3:end),"spline",1);
%名前に合わせてフレームごとのxyz座標を出力
if marker_name == "shoulder" % <======= 一重引用符を二重引用符に変更
markerdata = M(:,1:3);
elseif marker_name == "elbow" % <======= 一重引用符を二重引用符に変更
markerdata = M(:,10:12);
elseif marker_name == "wrist" % <======= 一重引用符を二重引用符に変更
markerdata = M(:,19:21)
end
end
  댓글 수: 2
Atsushi Ueno
Atsushi Ueno 2023년 3월 19일
> file_nameが'sholder'の時は実行されるのですが,それ以外の時は「配列のサイズがこの演算に適合しません。」とエラーが出ます
string型の文字列同士を == 演算子で比較する事は可能です。
文字列のサイズが異なっていても問題ありません。
比較結果も1文字毎ではなく文字列全体の比較結果となります。
"elbow" == "wrist"
ans = logical
0
"elbow" == "elbow"
ans = logical
1
"elbow" == "shoulder"
ans = logical
0
卓也
卓也 2023년 3월 20일
ありがとうございます.解決できました

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

추가 답변 (1개)

Atsushi Ueno
Atsushi Ueno 2023년 3월 19일
> file_nameに'shoulder','elbow'を入力したときもプログラムが実行させるにはどこを変えるべきでしょうか
下記プログラムのコメント箇所を変更します
function markerdata = extract_marker(file_name,marker_name)
M = readmatrix(file_name);
M = fillmissing(M(6:end,3:end),"spline",1);
%名前に合わせてフレームごとのxyz座標を出力
if strcmp(marker_name,'shoulder') % <======= ここを strcmp 関数に変更
markerdata = M(:,1:3);
elseif strcmp(marker_name,'elbow') % <======= ここを strcmp 関数に変更
markerdata = M(:,10:12);
elseif strcmp(marker_name,'wrist') % <======= ここを strcmp 関数に変更
markerdata = M(:,19:21)
end
end
  댓글 수: 1
Atsushi Ueno
Atsushi Ueno 2023년 3월 19일
편집: Atsushi Ueno 2023년 3월 19일
> file_nameが'sholder'の時は実行されるのですが,それ以外の時は「配列のサイズがこの演算に適合しません。」とエラーが出ます
文字ベクトル同士を == 演算子で比較するには、比較対象が同一サイズである必要があります。比較結果も1文字毎の比較結果となります。
'elbow' == 'wrist'
ans = 1×5 logical array
0 0 0 0 0
'elbow' == 'wrbow'
ans = 1×5 logical array
0 0 1 1 1
'elbow' == 'shoulder'
Arrays have incompatible sizes for this operation.

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

카테고리

Help CenterFile Exchange에서 行列および配列에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!