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

12 Ansichten (letzte 30 Tage)
Kohei Yoshino
Kohei Yoshino am 17 Apr. 2024
Kommentiert: Kohei Yoshino am 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ファイル名を自動的に統一するにはどうすればいいですか?

Akzeptierte Antwort

Kojiro Saito
Kojiro Saito am 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 Kommentare
Kojiro Saito
Kojiro Saito am 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 am 20 Apr. 2024
返信が遅くなりすみません。うまく作動しました。いつもありがとうございます。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu ビッグ データの処理 finden Sie in Help Center und File Exchange

Produkte


Version

R2023b

Community Treasure Hunt

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

Start Hunting!