找到一个数值模式在一个向量

8视图(30天)
Saikrishna
Saikrishna 2023年4月19日
评论道: Saikrishna2023年4月21日
你好,
我有一个数值向量和我试图找到一个模式(一个丢失的数量)向量。
例子:
数值向量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)与一个丢失的数量。

接受的答案

Stephen23
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)
X = 21
Y = 25
V (X, Y)
ans = 1×5
3 4 5 1 2
1评论
Saikrishna
Saikrishna 2023年4月21日
谢谢你! @Stephen23 这是我在寻找什么。

登录置评。

答案(1)

Les贝克汉姆
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,帕特,“匹配”)
结果=1×2单元阵列
{' 3 4 5 1 2}{3 4 10 1 2的}
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
或接近

登录置评。

类别

找到更多的在字符和字符串帮助中心文件交换

下载188bet金宝搏


释放

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!