1

我有一个M x N带有字段的大小结构数组,var它们val是向量。

我想做的是得到一个M x N大小矩阵A,其中每个元素都包含来自结构数组的向量(或)A(i, j)的总和值varval

例如:

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(messages.val)sum(messages(:,:).val)...)使用 sum 函数,但无法获得所需的结果。

4

2 回答 2

1

您可以使用以下方法将字段元素放入一个矩阵中:

svals = [myStructure.val];

如果val总是相同的长度(让我们命名它P),这将是一个numel(myStructure)*P x 1包含所有字段的所有值的向量。你当然可以重新塑造它:

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

现在只需对第一个维度求和,就可以得到MxN大小A矩阵:

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

在最后一步中应用挤压A以删除生成的单例维度(否则将是 size 1xMxN)。

如果val长度可以变化,我认为除了循环它或使用arrayfun 之外别无他法,这与循环基本相同:

A = arrayfun(@(x) sum(x.val),myStructure);
于 2012-08-07T15:56:03.903 回答
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
于 2012-08-08T03:24:40.950 回答