変数名にsprint​fのような関数を使用​できますか?

58 views (last 30 days)
Kohei Yoshino
Kohei Yoshino on 17 Apr 2024
Commented: Kohei Yoshino on 20 Apr 2024
csvのファイル名がname_segment_speed.csvというように名前と速度で特徴づけています。
右辺のcsvにsprintfは適応できたのですが、左辺の変数名にsprintfを使用すると、
name = 'A';
speed = 'normal';
sprintf('%s_lumber_%s, name, speed) = readmatrix(sprintf('%s_lumber_%s.csv', name, speed));
「左辺のインデックスが右辺とサイズが適合しないため、代入は実行できません。」というエラーメッセージが出てしまいます。
変数名とcsvファイル名を自動的に統一するにはどうすればいいですか?

Accepted Answer

Kojiro Saito
Kojiro Saito on 17 Apr 2024
assignin関数を使えばできます。ベースワークスペース変数にsprintfで作る変数名、変数値にreadmatrixの読み込みデータを割り当ててみてください。
name = 'A';
speed = 'normal';
assignin('base', sprintf('%s_lumber_%s', name, speed), readmatrix(sprintf('%s_lumber_%s.csv', name, speed)));
disp(A_lumber_normal)
1 2 3
  4 Comments
Kojiro Saito
Kojiro Saito on 19 Apr 2024
assigninは出力を返さないので、time=assigninという書き方はできません。assignin('base', 'time', xxx)という構文になります。
関数ハンドルを使って1列目をリターンするような無名関数tempFuncを作成し、それをassigninに入れれば実現できます。
name = 'A';
speed = 'normal';
assignin('base', sprintf('%s_lumber_%s', name, speed), readmatrix(sprintf('%s_lumber_%s.csv', name, speed)));
tempFunc = @(x) x(:, 1);
assignin('base', 'time' , tempFunc(readmatrix(sprintf('%s_lumber_%s.csv', name, speed))));
disp(time)
1
ただ、既にCSVからデータを読み取って変数A_lumber_normalに割り当てているので、timeを作るときにまたCSVを読み込むのは非効率です。文字列からワークスペース変数を取得するevalinを使ってみるのも一案ですね。
tempFunc = @(x) x(:, 1);
time = tempFunc(evalin('base', sprintf('%s_lumber_%s', name, speed)));
disp(time)
1
Kohei Yoshino
Kohei Yoshino on 20 Apr 2024
返信が遅くなりすみません。うまく作動しました。いつもありがとうございます。

Sign in to comment.

More Answers (0)

Categories

Find more on ビッグ データの処理 in Help Center and File Exchange

Products


Release

R2023b

Community Treasure Hunt

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

Start Hunting!