是否可以使用MATLAB执行类似正则表达式的操作来过滤掉事情?基本上我正在寻找一些可以让我采用矢量的东西:
[1 2 1 1 1 2 1 3 3 3 3 1 1 4 4 4 1 1]
并将返回:
[3 3 3 3 4 4 4]
这些是不间断的序列(没有散布的地方)。
这可能吗?
答案 0 :(得分:1)
使用MATLAB的内置regexp
函数进行正则表达式匹配。但是,您必须先将输入数组转换为字符串,然后才将其提供给regexp
:
C = regexp(sprintf('%d ', x), '(.+ )(\1)+', 'match')
请注意,我将值与空格分开,以便regexp
也可以匹配多个数字。然后将结果转换回数值数组:
res = str2num([C{:}])
模式字符串中的点(.
)表示任何字符。要仅查找某些数字的序列,请在括号中指定它们([]
)。例如,仅查找3和4序列的模式将是:
([34]+ )(\1)+
您可以使用diff
:
res = x((diff([NaN; x(:)])' == 0) | (diff([x(:); NaN])' == 0))
或者,您可以仅保留结果中的某些值,例如:
res(res == 3 | res == 4)
答案 1 :(得分:0)
你可以这样做:
v=[1 2 1 1 1 2 1 3 3 3 3 1 1 4 4 4 1 1];
vals=unique(v); % find all unique values in the vector
mask=[]; % mask of values to retain
for i=1:length(vals)
indices=find(v==vals(i)); % find indices of each unique value
% if the maximum difference between indices containing
% a given value is 1, it is contiguous
% --> add this value to the mask
if max(indices(2:end)-indices(1:end-1))==1
mask=[mask vals(i)];
end
end
% filter out what's necessary
vproc=v(ismember(v,mask))
结果:
vproc =
3 3 3 3 4 4 4
答案 2 :(得分:0)
这可能是另一种方法,虽然有点过于精细化。
如果您看到数组的图,您希望保留其拓扑连接(即由一个部分制作)的级别集(即a == const
)。
相关地,此类级别集恰好与a==3
和a==4
对应的级别集。
这是一个可能的实现
a = [1 2 1 1 1 2 1 3 3 3 3 1 1 4 4 4 1 1]
r = []; % result
b = a; % b will contain the union of the level sets not parsed yet
while ~isempty(b)
m = a == b(1); % m is the current level set
connected = sum(diff([0 m 0]).^2) == 2; % a condition for being a connected set:
% the derivative must have 1 positive and 1
% negative jump
if connected == true % if the level set is connected we add it to the result
r = [r a(m)];
end
b = b(b~=b(1));
end
答案 3 :(得分:-1)
如果您尝试类似
的话a = [1 2 1 1 1 2 1 3 3 3 3 1 1 4 4 4 1 1] %initial vector
b = a>=3 %apply filter condition
a = a(b) %keep values that satisfy filter
a将输出
a = [3 3 3 3 4 4 4]