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

12 vues (au cours des 30 derniers jours)
Kohei Yoshino
Kohei Yoshino le 17 Avr 2024
Commenté : Kohei Yoshino le 20 Avr 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ファイル名を自動的に統一するにはどうすればいいですか?

Réponse acceptée

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

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur ビッグ データの処理 dans Help Center et File Exchange

Produits


Version

R2023b

Community Treasure Hunt

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

Start Hunting!