我在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]';
第一行中的每个元素都对应于a0
或1
第二行中的元素。我需要治疗的组中的每一个0's
和1's
块作为这样我可以挑出元件,使得我有包含所有的向量第一所述的元件1
块,然后包含所有另一个向量第二所述的元件1
块,以此类推,直到我把所有要素都分开了。
因此,例如vector1=[1.0 2.1]
,vector2=[1.1 2.2]
等等。
这是因为我需要对块之间的各个点求平均值,以便获得例如avg_vector1,avg_vector2,avg_vector3等。
到目前为止,我一直在尝试编写一个循环来完成此操作,但我已经知道它不会那么有效,并且每次都可能无法正常工作,因为我必须if
为每个j
变量都设置一个(见下文),并且“ “ j's”不是真正固定的,有时块可能会更长,有时可能会更短。
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**
有人知道如何更优雅,更简单地执行此操作吗?
谢谢
(希望)正确的版本:
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
经常使用!
[原始错误答案已删除]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句