从字符串中提取最后的子字符串
66(30天)
显示旧的评论
大家好,
我想提取前最后一个字符串“EP”。
我试着第一次分割字符串strsplit函数。然后得到最后一个字符串使用for循环。
我认为这是可以做到不使用for循环。
请给我一些帮助如何让代码没有使用for循环。
负载input.mat
temp = cellfun (@ (x) strsplit (x, {', ' EP}),输入,UniformOutput,假);%分割的字符串
i = 1:长度(临时)
num(我:)= str2double(临时{我}(end-1));%填补最后正确的字符串细胞
结束
0评论
接受的答案
Dyuman Joshi
2022年9月2日
编辑:Dyuman Joshi
2022年9月2日
负载input.mat
num = cellfun (@ (x) str2double (extractBetween (x,找到(x = =' ',1“最后一次”)+ 1,“EP”)),输入)
更多的答案(5)
Stephen23
2022年9月2日
避免CELLFUN缓慢,STR2NUM、正则表达式等。
一个SSCANF调用可能是最有效的方法到目前为止,除了非常简单:
S =负载(“input.mat”);
C = S.input
V = sscanf ([C {}):% * % *年代%聚全氟乙丙烯的)
2的评论
Stephen23
2022年9月2日
编辑:Stephen23
2022年9月2日
str2num,“你怎么知道cellfun regexp等功能更慢?”
- 多年的阅读这篇文章和其他论坛,学习许多用户知识的总和。
- 多年的为自己的代码编写单元测试(即进行修改和比较)。
- 阅读文档,了解特性函数和如何使用它们。
- 内部知识功能,例如STR2NUM调用EVAL(因此不是由JIT优化引擎),和CELLFUN设计必须调用一个函数处理重复(低于一个循环)。
让我们在这个线程比较目前给出的答案:
S =负载(“input.mat”);
C = repmat (S.input 1 e3 1);%大数组- >更容易比较
时间(@ ()funAtsushiUeno (C))% REGEXP, CELLFUN STR2NUM
时间(@ ()funDyumanJoshi (C))% CELLFUN, EXTRACTBETWEEN STR2DOUBLE
时间(@ ()funChunru (C))% REGEXP, CELLFUN STR2NUM
时间(@ ()funImageAnalyst (C))%循环和索引
时间(@ ()funKSSV (C))% REGEXP, STRREP STR2DOUBLE
时间(@ ()funS23 (C))% SSCANF
函数是超过8倍接下来最快的功能(从KSSV),除了最简单的。和我有一个公平的想法是这样,之前编写测试代码。
”,有什么资源,我可以了解更多关于这个?”
如果你想学习如何使用MATLAB的效率,我的建议是读这个论坛很多。当我写“很多”,我不是说“一点点”。而不仅仅是新语丝:有一些非常重要的话题,讨论了在一些旧规范的线程在这个论坛。
V1 = funAtsushiUeno (C);
V2 = funDyumanJoshi (C);
V3 = funChunru (C);
V4 = funImageAnalyst (C);
V5 = funKSSV (C);
V6 = funS23 (C);
isequal (V1 (:), V2 (:), V3 (:), V4 (:), V5 (:), V6 (:))%检查函数输出:
函数num = funAtsushiUeno (C)
num = regexp (C,”((\ d + - e) +) EP \ s *美元”,“令牌”);
num = (num {:});
num = (num {:});
num = cellfun (@str2num, num);
结束
函数num = funDyumanJoshi (C)
num = cellfun (@ (x) str2double (extractBetween (x,找到(x = =' ',1“最后一次”)+ 1,“EP”)),C);
结束
函数y = funChunru (C)
s = regexp (C,\年代([\ d \] *) EP的美元,“令牌”);
y = cellfun (@ (s) str2num (s {1} {1}), s);
结束
函数数量= funImageAnalyst(数据)
行=元素个数(数据);
数量= 0(行,1);
为行= 1:行
话说= strsplit(数据行{});
lastWord =话说{结束};
数字(行)= str2double (lastWord (1: end-2));
结束
结束
函数s = funKSSV (C)
表达=' \ d + \ ? \ d * EP”;
s = regexp (C,表达式,“匹配”);
s = strrep ([s {}): ',“EP”,”);
s = str2double(年代);
结束
函数V = funS23 (C);
V = sscanf ([C {}):% * % *年代%聚全氟乙丙烯的);
结束