変数名に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ファイル名を自動的に統一するにはどうすればいいですか?

 Respuesta aceptada

Kojiro Saito
Kojiro Saito el 17 de Abr. de 2024

2 votos

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 comentarios

Kohei Yoshino
Kohei Yoshino el 18 de Abr. de 2024
ありがとうございます。思い通りの結果が返ってきました。
Kohei Yoshino
Kohei Yoshino el 18 de Abr. de 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 el 19 de Abr. de 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 el 20 de Abr. de 2024
返信が遅くなりすみません。うまく作動しました。いつもありがとうございます。

Iniciar sesión para comentar.

Más respuestas (0)

Productos

Versión

R2023b

Etiquetas

Preguntada:

el 17 de Abr. de 2024

Comentada:

el 20 de Abr. de 2024

Community Treasure Hunt

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

Start Hunting!