2012-06-27 30 views
1

我有以下叫做test的結構數組,其中每個字段都是包含矩陣的[1x3]結構數組。我想創建一個新的字段levelsq,它將每個矩陣的元素逐個方格。我可以用一個循環做到這一點:結構數組 - 在沒有循環的域內對矩陣進行操作

[test(1:3).level] = deal([1,1],[2,2],[3,3]) 

for i = 1:3 
    test(i).levelsq = test(i).level.^2 
end 

test.level 
ans = 
    1  1 
ans = 
    2  2 
ans = 
    3  3 

test.levelsq 
ans = 
    1  1 
ans = 
    4  4 
ans = 
    9  9 

我已經通過分離和連接的元素得到了一些辦法,但至今尚未能夠添加新的領域:

temp = num2cell([test.level].^2) 
test.levelsq = temp{:} 
??? Illegal right hand side in assignment. Too many elements. 

然後我試圖重塑臨時變量,但它仍然是不正確的形式

temp2= reshape(temp,2,3)' 
temp2 = 
[1] [1] 
[4] [4] 
[9] [9] 

是否有更簡單的方法來做到這一點沒有循環或具有與內容分開?謝謝。

回答

1
test = arrayfun(@(x) setfield(x, 'levelsq', x.level .^ 2), test); 

順便說一句,如果你設置的列向量,就可以方便地訪問數組的值:

>> [test.level] 

ans = 

    1  2  3 
    1  2  3 

>> [test.levelsq] 

ans = 

    1  4  9 
    1  4  9 
+0

完美。謝謝! – user1486856

+1

+1不錯的解決方案 – Amro

0

你可能要考慮你所需要的數據類型,爲您的應用。您目前正在使用數值數組,單元陣列和結構(雙重嵌套結構!)。

「Matlab」方法將使用數值數組,即矩陣做所有這些。它們高度優化,非常有利於數學運算。

你可以這樣做:

level = [ 1 1; 2 2; 3 3;]; 
levelsq = level.^2; 

如果你想要一個單一的數據結構來保存這兩個levellevelsq,你可以將兩者連接起來成爲一個三維矩陣:

test = cat(3, level, levelsq); 

你可通過撥打test(:,:,1)訪問級別,並通過調用test(:,:,2)訪問levelsq。

另一方面,如果您需要保留您使用的數據結構,則無法擊敗@Serg。

+0

感謝您的反饋。我最初使用矩陣編碼我的問題,但尺寸非常大(> 10),因此我試圖使用結構來重新組織/跟蹤所有移動部件。謝謝。 – user1486856

相關問題