我想知道如何通过以下方式在MATLAB中组合向量: 我有一个载体
S= [0.1 0.2 0.1 0.3 0.1 0.5 1 3]
第二个长度相同的载体
B= [1 1 4 4 6 7 9 10]
现在我需要一个矢量A,其元素与B中的潜在数字一样多(在本例中为10),当B的内容等于A的索引时,此向量应包含S的值。如果有的话是几个潜在的S值,它应该包含那些的平均值。如果B中没有等于A的索引的值,则A应该包含Na。
所以在这个例子中
A= [0.15 NaN NaN 0.2 NaN 0.1 0.5 NaN 1 3]
答案 0 :(得分:0)
您可以循环并计算1和max(B)
之间所有索引的均值。您可以使用逻辑索引(S
)提取S(B == k)
的元素以进行平均。此外,空数组(mean([])
)的平均值总是会产生NaN
,因此在NaN
没有&#的情况下会自动为您创建B
值39; t包含特定索引。
A = arrayfun(@(k)mean(S(B == k)), 1:max(B))
% 0.1500 NaN NaN 0.2000 NaN 0.1000 0.5000 NaN 1.0000 3.0000
如果我们将其分解为for循环,它将看起来像这样
for k = 1:max(B)
% Find elements of B that contain this value of k
touse = B == k;
% Grab elements of S that correspond to these entries in B
svalues = S(touse);
% Now take the average and store it in our result.
% If svalues is empty, then this will be a NaN
A(k) = mean(svalues);
end
如果我们希望这更加通用,我们可能希望制作范围min(B):max(B)
而不是1:max(B)
A = arrayfun(@(k)mean(S(B == k)), min(B):max(B));
答案 1 :(得分:0)
这就是accumarray
的作用:
A = accumarray(B(:), S(:), [], @mean, NaN).';
第三个输入[]
指定结果的大小应尽可能小,由最大值B
确定。第四个输入@mean
指定要应用于由S
的每个值确定的B
的每个元素组的函数。第五个输入NaN
是填充值。