Help with use of regular expression
1 次查看(过去 30 天)
显示 更早的评论
Problem: I have a cell array of strings
TrajLocationCompact(1, 3).locationIdCompact1
ans =
'1 1 1 1 1 32'
'29 7 1 1 2 2 2 1 1 29'
'2 1 1 2 1 1 1 1 1 1 1'
'29 29 29 39 39 29'
'29 29 37 29 29 29 29'
'29 3 2 2 1 2 1 1 1 1 1 2'
'29 3 1 1 2 1 1 2 1 2 1 29'
'3 1 1 2 1 1 2 1 1 1'
'29 29 29 29 29 29 29 29 29 1 2 2 16 5 1 1 2 1'
'29 29'
'29'
I want to trasform it in this way
'1 1 1 1 1 32' --> 1 32
'29 7 1 1 2 2 2 1 1 29' --> 29 7 1 2 1 29
'2 1 1 2 1 1 1 1 1 1 1' --> 2 1 2 1
'29 29 29 39 39 29' --> 29 39 29
'29 29 37 29 29 29 29' --> 29 37 29
'29 3 2 2 1 2 1 1 1 1 1 2' --> 29 3 2 1 2 1 2
'29 3 1 1 2 1 1 2 1 2 1 29' --> 29 3 1 2 1 2 1 29
'3 1 1 2 1 1 2 1 1 1' --> 3 1 2 1 2 1
'29 29 29 29 29 29 29 29 29 1 2 2 16 5 1 1 2 1' --> 29 1 2 16 5 1 2 1
'29 29' --> 29
'29' --> 29
Can you help me to find a regular expression that do it?
0 个评论
采纳的回答
Stephen23
2015-12-11
编辑:Stephen23
2015-12-11
Your example indicate that you want to convert these string numbers to numeric, and then collect the runs of one value together into one element. This is easy using diff:
>> C = {'1 1 1 1 1 32','29 7 1 1 2 2 2 1 1 29'};
>> D = cellfun(@(s)sscanf(s,'%f'),C,'UniformOutput',false);
>> E = cellfun(@(v)v([true;diff(v)~=0]),D,'UniformOutput',false);
>> E{:}
ans =
1
32
ans =
29
7
1
2
1
29
2 个评论
Joseph Cheng
2015-12-11
to expand on Stephen's you can write a function as such
function cellout = mycellfun(cellin)
numbers = str2num(cellin);
points = [1 find(diff(numbers)~=0)+1];
cellout = num2str(numbers(points));
end
and use it on your data
test = cellfun(@mycellfun,temp,'uniformoutput',false)
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Cell Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!