如何对结构中的矩阵(向量)元素求和

时间:2012-08-07 15:26:59

标签: arrays matlab struct sum

我有一个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)相同。

有没有人知道如何在不使用for循环的情况下在Matlab中完成这项工作?

我尝试过以多种方式使用sum函数(sum(messages.val)sum(messages(:,:).val) ...)但无法获得所需的结果。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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