for循环平均个别时间点Matlab

时间:2016-05-03 11:31:46

标签: arrays matlab sorting for-loop average

我在Matlab中有一个21x2向量,如下所示:

A = [0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5;
     0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   1   1   1   1   1]'; 

第一行中的每个元素对应于第二行中的01。我需要将0's1's中的每一个视为块,以便我可以挑出元素,以便我有一个包含所有第一个元素的向量1阻止,然后另一个包含1块的所有 second 元素的向量,依此类推,直到我将所有元素分开。

所以例如vector1=[1.0 2.1]vector2=[1.1 2.2]等等。

这是因为我需要对块之间的各个点进行平均,以便我可以例如avg_vector1,avg_vector2,avg_vector3 ......等等。

到目前为止,我一直在尝试编写一个循环来执行此操作,但我已经可以说它不会那么高效,并且可能每次都不起作用,因为我必须为每个{if设置j {1}}(见下文)和“j的数量”并没有真正固定,有时块可能更长,有时可能更短。

j=1;
for i=1:size(A,1)
 if A(i,2)==1
    if j==1 
        vector1(i)=A(i,1);
        j=j+1; %j is acting as a counter for the "size" of the block of 0's and 1's
    if j==2
        vector2(i)=A(i,1);
    **incomplete**

有谁知道如何更优雅和简单地做到这一点?

由于

1 个答案:

答案 0 :(得分:3)

(希望)正确的版本:

M = logical(A(:, 2));
is_start = [M(1); ~M(1:end-1) & M(2:end)];
is_start = is_start(M); 
A_valid = A(M, 1);
group_idx = cumsum(is_start); 
group_start_idx = find(is_start);
sub_idx = (1:numel(is_start))' - group_start_idx(group_idx)+1;
means = accumarray(sub_idx, A_valid, [], @mean);

有一个稍微简洁的方法可以用一两个步骤来做到这一点,但这应该有效。

上课:更频繁地使用cumsum

[删除原始错误答案]