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

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

2 Stimmen

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

Kohei Yoshino
Kohei Yoshino am 18 Apr. 2024
ありがとうございます。思い通りの結果が返ってきました。
Kohei Yoshino
Kohei Yoshino am 18 Apr. 2024
上記のコードではうまくいったのですが、その後に続く処理の過程にもassigninで定義した変数名をそのまま反映させたいのですが、「配列のインデックス付けが無効です。」というエラーが表示され読み込めませんでした。
% 変数定義:パス内にいくつものcsvがあるため、name,speedの値を変更するだけでワークスペース内に変数を保存していきたい
name = 'A';
speed = 'normal';
assignin('base', sprintf('%s_ltibia_%s', name, speed),...
readmatrix(sprintf('%s_ltibia_%s.csv', name, speed))); % このコードでワークスペース内にA_ltibia_normalという変数が保存できました
time = X(:,1); % このXに先ほど定義した変数名を入れたいです。
time = assignin('base', sprintf('%s_ltibia_%s', name, speed), ...
readmatrix(sprintf('%s_ltibia_%s.csv', name, speed)))(:,1) % 「配列のインデックス付けが無効です。」というエラーが表示される
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)

Produkte

Version

R2023b

Community Treasure Hunt

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

Start Hunting!