我在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]';
第一行中的每个元素对应于第二行中的0
或1
。我需要将0's
和1'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**
有谁知道如何更优雅和简单地做到这一点?
由于
答案 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
!
[删除原始错误答案]