0

これは、私を助けてくれた別のスタックオーバーフロー参加者からの解決策です。データはcsvファイルから来ています:

    States Damage Blizzards

    Indiana 1      3
    Alabama 2      3
    Ohio    3      2
    Alabama 4      2


%// Parse CSV file
[States, Damage, Blizzards] = textread(csvfilename, '%s %d %d', ...
    'delimiter', ',', 'headerlines', 1);

%// Parse data and store in an array of structs
[U, ix, iu] = unique(States);        %// Find unique state names
S = struct('state', U);              %// Create a struct for each state
for k = 1:numel(U)
    idx = (iu == k);                 %// Indices of rows matching current state
    S(k).damage = Damage(idx);       %// Add damage information
    S(k).blizzards = Blizzards(idx); %// Add blizards information
end

MATLAB では、一連の割り当てられた変数 (A1、A2、A3) をループで作成する必要があります。したがって、状態、竜巻、ハリケーンの 3 つのフィールドを持つ構造 S があります。

ここで、このメソッドを使用して A1 =、A2 = を割り当てようとしましたが、構造に対しては機能しないため、エラーが発生しました。

   for n = 1:numel(S)
   eval(sprintf('A%d = [1:n]',S(n).states));
   end

出力目標は、ループ内で構造体のフィールドに割り当てられた一連の変数です。

  A1 = 2 3
  A2 = 2 3
  A3 = 4 5
4

1 に答える 1

1

私はあなたの質問を100%理解しているとは言えません。
しかし、おそらくあなたはこのようなものを探しています:

for n = 1:numel(S)
   eval(sprintf('A%d = [S(n).damage S(n).blizzards]',n));
end

evalc代わりに使用するevalと、コマンドライン出力が抑制されます。

理由を少し説明

eval(sprintf('A%d = [1:n]',S(n).state));  

動作しません:

S(1).state  

戻り値

ans = 
   Alabama

これは文字列です。でも、

A%d

数値が必要です (数値のフォーマットについては、こちらを参照してください)。
さらに、

numel(S) 

収量

ans = 
   3

したがって、

eval(sprintf('A%d = [1:n]',n));

単純に次の出力を返します。

A1 =

 1

A2 =

 1     2

A3 =

 1     2     3  

したがって、変数名のカウンターとして必要ですが、カウンターとして使用nして、他の構造体フィールド (damageおよびblizzards)のエントリのベクトルを構成しますn

于 2013-05-09T20:59:11.517 に答える