【问题标题】:How to sum matrix (vector) elements in a structure如何对结构中的矩阵(向量)元素求和
【发布时间】:2012-08-07 15:26:58
【问题描述】:

我有一个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) ...),但无法获得所需的结果。

【问题讨论】:

  • val 向量场的长度是否始终相同?例如,在您的示例中为 3?还是会有所不同?
  • val 长度可以变化。

标签: arrays matlab struct sum


【解决方案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)。

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

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

【讨论】:

    【解决方案2】:

    这里有一个稍微不同的解决方案。首先让我们创建一个用于测试的数组结构:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2019-11-09
      • 1970-01-01
      • 2017-11-18
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多