找到一个数值模式在一个向量
8视图(30天)
显示旧的评论
你好,
我有一个数值向量和我试图找到一个模式(一个丢失的数量)向量。
例子:
数值向量vec = [5 6 3 1 2 3 4 5 6 1 2 6 5 4 2 3 11 2 31 3 4 5 1 2 6 31 11 2 5]
模式:帕特= [3 4 * 1 2]
我知道解决方案如果可以有一个或多个失踪数字例如:[开始结束]=
正则表达式(字符(vec),字符(
[3 4 * ?1 2]
),
“开始”
,
“结束”
)提供启动和端点的模式(
1 2 3 4 5 6
)和(
3 4 5 1 2)向量。但我只寻找(3 4 5 1 2)与一个丢失的数量。
0评论
接受的答案
Stephen23
2023年4月20日
编辑:Stephen23
2023年4月20日
你的基本概念是好的。你需要选择一个适当的字符匹配和量词。注意,星号实际上是一个量词,问号(上下文依赖):
你也没有考虑到任何需要转义的字符,例如char(36) = =“美元”
假设只有0和65535之间的整数,这里是一个健壮的方法(无延迟计算字符):
V =(5、6、1、2、3, 3, 4, 5, 6, 1、2、6、3、5、4、2、3, 11日,31日,3日,4日,5日,1,2,6日,31日,11日,2、5];
F = @ (n) regexptranslate (“逃”char (n));
R = sprintf (' % s % s '(3、4),F (), F ([1,2]));
(X, Y) = regexp (F (V), R)
V (X, Y)
答案(1)
Les贝克汉姆
2023年4月19日
编辑:Les贝克汉姆
2023年4月19日
注意,我添加了一个额外的测试vec确保年底这个数字处理multi-digit模式的中间位置(1 2 3 4 10日)
vec = [5 6 3 1 2 3 4 5 6 1 2 6 3 5 4 2 3 11 2 31 3 4 5 1 2 6 31 11 2 5 3 4 10 1 2];
str = num2str (vec);
帕特= [‘3 \ s + 4 \ s + \ d + \ s + 1 \ s + 2》];
结果= regexp (str,帕特,“匹配”)
2的评论
沃尔特·罗伯森
2023年4月20日
vec = [5 6 3 1 2 3 4 5 6 1 2 6 3 5 4 2 3 11 2 31 3 4 5 1 2 6 31 11 2 5 3 4 10 1 2];
str = num2str (vec);
帕特= [‘3 \ s + 4 \ s + \ d + \ s + 1 \ s + 2》];
结果= regexp (str,帕特)
将返回起点的指标吗
在特征向量str
。这是有点问题,因为你将不得不把字符数组向量指标指数,操作的可能性,并非所有条目可能有相同的宽度(如果他们有相同的宽度计算变得简单。)
一个办法让他们都有相同的宽度是使用类似
digits_needed =长度(num2str (max (vec));
fmt = sprintf (“% % % dd”,digits_needed);
str =加入(组成(fmt, vec),' ');
帕特=‘3 \ s + 4 \ s + \ d + \ s + 1 \ s + 2》;
str_locations = regexp (str,帕特);
vec_indices = (str_locations - 1) / (digits_needed + 1) + 1
或接近