我有一个M x N
大小的结构数组,其中的字段var
和val
是矢量。
我想要的是获得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)
...)但无法获得所需的结果。
答案 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