2013-05-09 56 views
0

這是另一位幫助我的計算器參與者的解決方案。 數據從一個CSV文件來:Matlab:循環中的變量系列

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)。所以我有三個領域的結構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 
+0

我不確定這是否是'Matlab-way'的處理方式,如[解決] [這裏] – Schorsch 2013-05-09 19:53:15

+1

@ user1608954爲什麼你需要一堆不同名稱的變量?爲什麼不在該結構中創建另一個字段,或者至少使用[單元格陣列](http://www.mathworks.com/help/matlab/cell-arrays.html)? – 2013-05-09 20:06:09

+0

那麼,我正在生成一個不同的變量名稱,所以我可以繪製不同的變量。 Schorsch,這裏是一個結構:S = struct('Texas',0,'Kansas',1,'Maryland',2) – user1608954 2013-05-09 20:16:47

回答

1

我不是100%確定我理解你的問題。
但也許您正在尋找這樣的事情:

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

BTW使用evalc代替eval將抑制命令行輸出。

一點解釋,爲什麼

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

不起作用:

S(1).state 

回報

ans = 
    Alabama 

這是一個字符串。但是,

A%d 

需要一個數字(數字格式請參見this)。
此外,

numel(S) 

產生

ans = 
    3 

因此,

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

將簡單地返回以下輸出:

A1 = 

1 

A2 = 

1  2 

A3 = 

1  2  3 

因此,您希望n作爲變量名稱的計數器,但同樣使用n作爲計數器,組成其他結構字段(damageblizzards)中條目的向量。

+0

就是這樣。謝謝,Schorsch。我一直在做類似的工作,但無法完成。非常感謝。 – user1608954 2013-05-09 21:02:04