我有一个向量,我想从中提取所有 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]
谢谢!
答案 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中测试,我不是肯定的。[根据评论编辑]