我想在具有最短宽度的矢量中找到零峰值,即具有单个样本非零且相邻样本为零的峰值,即[0 ~0 0]
,其中~0
为峰值。示例:if x = [1 0 2 0 0 3 0 4 5 6 0 7 0 8]
,然后我想找到2,3和7并将它们设为0,即x
变为[1 0 0 0 0 0 0 4 5 6 0 0 0 8]
。下面的代码可以解决这个问题,但是有更高效或更好的方法可以做到这一点,或者是否存在在向量(甚至矩阵)中找到特定模式的Matlab函数?
% remove peaks of shape [0 ~0 0]
k = find(x);
for j=k'
if j==numel(x) || j==1
elseif ~x(j-1) && ~x(j+1)
x(j) = 0;
end
end
答案 0 :(得分:8)
您正在寻找与内核[1,1,1]
的卷积与原始卷积无差异的元素。唯一的复杂因素是我们必须忽略边缘情况:
x = [1 0 2 0 0 3 0 4 5 6 0 7 0 8];
y = conv(x,[1,1,1],'same');
ind = find(x==y);
x(ind(2:end-1)) = 0
或
x(find(x(2:end-1)==conv(x,[1,1,1],'valid'))+1) = 0
如果面对正面和负面数字的前景,那么根据Craigim在评论中的建议:
xx = abs(x);
x(find(xx(2:end-1)==conv(xx,[1,1,1],'valid'))+1) = 0
答案 1 :(得分:5)
使用NumberPattern.executeQuery("select np.id, count(dns) " +
"from NumberPattern np left join np.dns dns " +
"where dns.pattern = np and np.id = xyz group by np")
(按照Dan的回答)可能是最好的方法;但也可以使用strfind
:
conv
或使用diff
计算二阶差异:
x(strfind(x~=0, [0 1 0]) + 1) = 0;
答案 2 :(得分:5)
这是我的方法
x_add = x(1:end-2) + x(2:end-1) + x(3:end);
x(find([0,x(2:end-1)==x_add,0]))=0;
它会为每个值添加上一个值和下一个值,并检查哪个值没有更改