2012-08-07 277 views
1

我有一個M x N大小的結構數組,其字段爲varval,它們是向量。如何加總結構中的矩陣(向量)元素

我想做的是得到一個M x N尺寸的矩陣A,其中每個元素A(i, j)包含來自結構陣列

矢量var(或val)的總和值。例如:

myStructure(1,5) 

ans = 

    var: 1 
    val: [0.0100 0.1800 0.8100] 

sum(myStructure(1,5).val) 

ans = 

    1 

myStructure(7,8) 

ans = 

    var: [1 3] 
    val: [1x9 double] 

myStructure(7,8).val 

ans = 

    Columns 1 through 6 

    0.1111 0.1111 0.1111 0.1111 0.1111 0.1111 

    Columns 7 through 9 

    0.1111 0.1111 0.1111 

因此,A(1,5)應該是1並且相同的方式,所有元素A(i,j)應該等於sum(myStructure(i,j).val)

有誰知道如何在Matlab中完成而不使用for循環?

我試着用多種方式使用求和函數(sum(messages.val)sum(messages(:,:).val) ...),但無法得到想要的結果。

+0

是'val'矢量場八方通相同的長度?例如3你的例子?或者可以變化嗎? – 2012-08-07 15:48:51

+0

val的長度可能會有所不同。 – 2012-08-07 16:00:10

回答

1

可以使用獲得該領域元素融入其中矩陣:

svals = [myStructure.val]; 

如果val始終是相同的長度(我們將其命名爲P),這將是包含在所有領域的所有值numel(myStructure)*P x 1矢量序列。您可以reshape它當然回:

[N,M]=size(myStructure); 
P = numel(myStructure(1,1).val); 
svals = reshape(svals,[P M N]); 

,現在只是總結的第一個維度,這讓你MxN大小A矩陣:

A = squeeze(sum(svals,1)); 

squeeze在這最後一步,刪除生成的應用單身尺寸(否則A的尺寸將爲1xMxN)。

如果val長度可以變化,我認爲沒有其他方式比循環,或者使用arrayfun,這是基本相同的循環:

A = arrayfun(@(x) sum(x.val),myStructure); 
0

這裏有一個稍微不同的解決方案。首先,讓我們創建一個測試用的陣列結構:

s = struct(); 
for i=1:5 
    for j=1:3 
     s(i,j).var = i+j; 
     s(i,j).val = rand(1,randi(10)); %# different lengths vectors 
    end 
end 

現在我們要做的總和:

A = cellfun(@sum, reshape({s.val}, size(s))) 

A = 
     1.9278  3.0719  5.8731 
     3.2377  0.43874  2.2374 
     3.0661  2.8892  4.1455 
     1.9093  1.4758  1.441 
     4.8731  0.5308  3.4076