从数组中提取特定数量的块

时间:2016-08-15 02:29:23

标签: arrays matlab

我有一个向量,我想从中提取所有 4

x = [1 1 1 4 4 5 5 4 6 1 2 4 4 4 9 8 4 4 4 4]

这样我就会得到4个载体或一个包含 4 的4个块的单元格:

[4 4], [4], [4 4 4], [4 4 4 4]

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用arrayfun

从适当的范围创建单元格
x = [1 1 1 4 4 5 5 4 6 1 2 4 4 4 9 8 4 4 4 4];     
x = [0, x, 0]; D = diff (x==4);               % pad array and diff its mask
A = find (D == 1); B = find (D == -1);        % find inflection points
out = arrayfun (@ (a,b) {x(a+1 : b)}, A, B)   % collect ranges in cells

答案 1 :(得分:1)

使用regionprops我们可以设置属性PixelValues,这样函数返回1s而不是4s

x = [1 1 1 4 4 5 5 4 6 1 2 4 4 4 9 8 4 4 4 4]
{regionprops(x==4,'PixelValues').PixelValues}

如果我们设置属性PixelIdxList,则该函数返回索引为4s的单元格:

{regionprops(x==4,'PixelIdxList').PixelIdxList}

更新(没有图像处理工具箱): 通过这种方式,我们可以获得每个连接组件的元素数量:

c = cumsum(x~=4)
h=hist(,c(1):c(end));
h(1)=h(1)+~c(1);
result = h(h~=1)-1

答案 2 :(得分:1)

idx=find(x==4);
for (i= 1:length(idx)) 
   if (i==1 || idx(i-1)!=idx(i)-1)if(i!=1) printf(",") endif; printf("[") endif;
   printf("4");
   if (i<length(idx)&&idx(i+1)==idx(i)+1) printf(",") else printf("]") endif
endfor

注意这不会给出实际的向量,但它会给出你想要的输出。以上是OCtave代码。我很确定改变endfor和endif to end会在MAtlab中工作,但是没有在matlab中测试,我不是肯定的。[根据评论编辑]