在Matlab中组合向量

时间:2016-03-25 14:23:14

标签: matlab vector

我想知道如何通过以下方式在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]

2 个答案:

答案 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是填充值。