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

7 ビュー (過去 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 Center および File Exchange行列および配列 についてさらに検索

Community Treasure Hunt

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

Start Hunting!