从字符串中提取最后的子字符串

66(30天)
大家好,
我想提取前最后一个字符串“EP”。
我试着第一次分割字符串strsplit函数。然后得到最后一个字符串使用for循环。
我认为这是可以做到不使用for循环。
请给我一些帮助如何让代码没有使用for循环。
负载input.mat
temp = cellfun (@ (x) strsplit (x, {', ' EP}),输入,UniformOutput,假);%分割的字符串
i = 1:长度(临时)
num(我:)= str2double(临时{我}(end-1));%填补最后正确的字符串细胞
结束

接受的答案

Dyuman Joshi
Dyuman Joshi 2022年9月2日
编辑:Dyuman Joshi 2022年9月2日
您可以使用 extractBetween 指数的最后一个空格字符和字符串的公分母结束时(EP)
负载input.mat
num = cellfun (@ (x) str2double (extractBetween (x,找到(x = =' ',1“最后一次”)+ 1,“EP”)),输入)
num = 30×1
11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000
1评论
铁匠铺
铁匠铺 2022年9月2日
哇. .非常感谢你、法规真的有效。我真的很感激。

登录置评。

更多的答案(5)

Stephen23
Stephen23 2022年9月2日
避免CELLFUN缓慢,STR2NUM、正则表达式等。
一个SSCANF调用可能是最有效的方法到目前为止,除了非常简单:
S =负载(“input.mat”);
C = S.input
C =30×1单元阵列
{“N88 220 d / 2 11 ep”} {N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}
V = sscanf ([C {}):% * % *年代%聚全氟乙丙烯的)
V = 30×1
11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000
2的评论
Stephen23
Stephen23 2022年9月2日
编辑:Stephen23 2022年9月2日
str2num,“你怎么知道cellfun regexp等功能更慢?”
  1. 多年的阅读这篇文章和其他论坛,学习许多用户知识的总和。
  2. 多年的为自己的代码编写单元测试(即进行修改和比较)。
  3. 阅读文档,了解特性函数和如何使用它们。
  4. 内部知识功能,例如STR2NUM调用EVAL(因此不是由JIT优化引擎),和CELLFUN设计必须调用一个函数处理重复(低于一个循环)。
让我们在这个线程比较目前给出的答案:
S =负载(“input.mat”);
C = repmat (S.input 1 e3 1);%大数组- >更容易比较
时间(@ ()funAtsushiUeno (C))% REGEXP, CELLFUN STR2NUM
ans = 0.5426
时间(@ ()funDyumanJoshi (C))% CELLFUN, EXTRACTBETWEEN STR2DOUBLE
ans = 0.4321
时间(@ ()funChunru (C))% REGEXP, CELLFUN STR2NUM
ans = 0.4083
时间(@ ()funImageAnalyst (C))%循环和索引
ans = 0.6536
时间(@ ()funKSSV (C))% REGEXP, STRREP STR2DOUBLE
ans = 0.3133
时间(@ ()funS23 (C))% SSCANF
ans = 0.0377
函数是超过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 (:))%检查函数输出:
ans =逻辑
1
函数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 {}):% * % *年代%聚全氟乙丙烯的);
结束

登录置评。


Chunru
Chunru 2022年9月2日
负载(websave (“input.mat”,“//www.tianjin-qmedu.com/matlabcentral/answers/uploaded_files/1114425/input.mat”))
输入
输入=30×1单元阵列
{“N88 220 d / 2 11 ep”} {N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}{N88 220 d / 2 11 ep的}{N88 220 d / 2 11 ep的}{N88 260 d / 2 8 ep的}{N88 260 d / 2 8 ep的}{A35000D + N14 1260 d 11.4 ep的}{A35000D + N14 1260 d 11.4 ep的}
s = regexp(输入,\年代([\ d \] *) EP的美元,“令牌”);
y = cellfun (@ (s) str2num (s {1} {1}), s)
y = 30×1
11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000
1评论
铁匠铺
铁匠铺 2022年9月2日
它的工作原理。谢谢你很多。我真的很感激。

登录置评。


Atsushi上野
Atsushi上野 2022年9月2日
移动:图像分析 2022年9月2日
这是一个挑战,因为我们需要处理单元阵列和不规则的数量大小。
我将使用正则表达式函数。
负载input.mat
num = regexp(输入,”((\ d + - e) +) EP \ s *美元”,“令牌”);
num = (num {:});
num = (num {:});
num = cellfun (@str2num num)
num = 1×30
11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000 11.4000 11.4000 11.0000 11.0000 8.0000 8.0000 11.4000 11.4000

图像分析
图像分析 2022年9月2日
这是方法之一。简单,直接,直观。虽然可能会有更紧凑,但神秘的方法。
s =负载(“input.mat”)
数据= s.input;%不打电话给你的变量输入,这是一个建立在功能!
行=元素个数(数据)
数量= 0(行,1);
行= 1:行
话说= strsplit(数据行{});
lastWord =话说{结束};
数字(行)= str2double (lastWord (1: end-2));
结束

KSSV
KSSV 2022年9月2日
表达=' \ d + \ ? \ d * EP”;
s = regexp(输入、表达“匹配”);
s = strrep ([s {}): ',“EP”,);
s = str2double (s)
1评论
铁匠铺
铁匠铺 2022年9月2日
谢谢你很多。它帮助我很多。我真的很感激。

登录置评。

类别

找到更多的在数据类型转换帮助中心文件交换

标签

s manbetx 845


释放

R2022a

社区寻宝

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

开始狩猎!