图片缩略图

排序:自然顺序排序

版本1.3.0.0(2.26 KB)由 道格拉斯·施瓦兹
按自然顺序对字符串进行排序。
5.0
77年评级

86下载

更新2011年1月22日

查看版本历史记录

查看许可协议

编者按:这个文件被选为MATLAB中心推荐商品

自然顺序排序对包含数字的字符串进行排序,以便将数字的数值考虑在内。它特别适用于对包含不同数字的索引号的文件名进行排序。通常,人们会使用前导零来获得正确的排序顺序,但使用此函数,您不必这样做t、 例如,输入

{'file1.txt'、'file2.txt'、'file10.txt'}

一个正常的排序会给你

{‘中’,‘file10.txt’,‘file2.txt}

然而,sort_nat会给你

{'file1.txt'、'file2.txt'、'file10.txt'}

引用为

道格拉斯·施瓦兹(2021年)。排序:自然顺序排序(//www.tatmou.com/matlabcentral/fileexchange/10959-sort_nat-natural-order-sort),MATLAB中心文件交换

意见及评分(95)

Zixuan你们

托马斯Babuska

刘林

做得好,非常感谢!

Ambadas Shinde

伟大的工作,
它将解决图像处理应用开发中的许多问题。

Binyuan陈

年代

孙伟

非常感谢!!!!

王峰

非常感谢,看似简单的处理,但是却解决了让人很头疼的问题!!

塔拉韦拉丽迪娅酒店

托马斯Boomgaard

伟大的服从,这在我的许多剧本中是必须的。如果你碰巧需要在字符串中使用这个,你可以尝试用'\d+'替换正则表达式'\d+(?:\.\d+)?',例如当前版本会这样做:

A = {'1;测试”、“10。测试”、“2。测试”、“1.3。测试”}

sort_nat (A)

ans =

1×4单元阵列

1.3“。测试“1。测试“2。测试“10.测试”

但改变后得到1。1.3测试的。测试“2。测试“10.测试”。

昂孔菲尼约马克

凯西的歌

^^非常感谢!这应该是Matlab的必备函数。

史蒂夫·帕克

贾斯汀•李

莉莉奥里利乌斯

很有用,谢谢! !

circuit_designer5172

这是一个非常棒的工具。谢谢!

努辛哈贾罗拉斯瓦迪

奥伦Shriki

马里奥Borja-Perez

超级方便的

毛罗。

由于道格拉斯

道格拉斯·施瓦兹

Antonio,这个页面是我提交的,sort_nat。natsort和NatsortFile是其他作者提交的。搜索它们。

安东尼奥·古铁雷斯

我正在使用2016a Matlab版本,我没有找到这个函数:natsort, natsortfiles

请帮帮我!!!!!!!!!

刘乔丹

卢卡达卡

非常有用!谢谢!

kes22

玛丽安娜Hovsepyan

将特纳

谢谢!

Zuzana Kvicalova

正是我所需要的,很棒的工具!非常感谢!:)

凯尔·查德威克

这正是我需要的!

帕特里夏

非常感谢:-)

Mortada海达尔

漂亮和整洁!

伊莱福

魏芳

非常好的工具,谢谢!

埃夫卡

太好了,谢谢。祝你今天愉快:)

道格拉斯·施瓦兹

在eFKa中,sort_nat需要一个字符串单元格数组。你可以这样做:

[~,顺序]= sort_nat ({files.name});
files_sorted =文件(秩序);

我们使用第二个输出来获取顺序,然后将该顺序应用到原始结构中。

道格

埃夫卡

我有一个名为files的50x1结构和一个名为name的字段,就像这样

'10up.txt'
'11up.txt'



“19 up.txt”
“1 up.txt”

我如何使用sort_nat(files.name)给我错误说“太多的输入参数”

演示

桑杰

谢谢! !

JWall

珍妮

Deyan列夫斯基

太棒了!工作完美无瑕,节省了一些电子工程师的时间。谢谢!

卡里姆·巴西姆

JavaDuncan

尤利西斯C

内森问

Stephen Cobeldick

使用诸如“sort_nat”之类的排序函数对文件名进行排序可能会返回非用户直观的排序,因为一些较长的文件名将在较短的文件名之前进行排序。这是由于char(0:45),包括[!”。$%&'()*+,-],在句点“.”之前进行排序。(char(46)用作扩展分隔符。例如:

fnm={。。。
“test2.m”;
‘test.m’;
“test10.m”;
“test1.m”;
“test-A.m”;
“test_A.m”;
' test10-old.m '};

% "sort"给出了数字子串的错误顺序:
排序(fnm)
ans ={…
“test-A.m”;
‘test.m’;
“test1.m”;
“test10-old.m”;
“test10.m”;
“test2.m”;
“test_A.m”}

% "sort_nat"以正确的顺序给出数字子串,但在'.'之前有'-':
sort_nat (fnm)
ans ={…
“test-A.m”;
‘test.m’;
“test1.m”;
“test2.m”;
“test10-old.m”;
“test10.m”;
“test_A.m”}
注意“test-A.”M '出现在更短的test之前。M ',和同样的'test10-old。“之前”test10.m”。希望较短的文件名在较长的文件名之前排序的用户需要使用不同的算法……

一个解决方案是将文件名和文件扩展名分开排序,为此我写了一个函数“natsortfiles”:
natsortfiles (fnm‘\ d + ', ' beforechar ')
ans ={…
‘test.m’;
“test1.m”;
“test2.m”;
“test10.m”;
“test10-old.m”;
“test-A.m”;
“test_A.m”}

它允许控制大小写敏感性、排序方向和数字子串匹配。你可以在FEX上找到这个函数:
//www.tatmou.com/matlabcentral/fileexchange/47434
它还接受完整路径,对目录层次结构的每一层也分别进行排序。

马里亚姆

非常感谢。它在同一个文件夹中。这就是我感到非常惊讶的原因。

道格拉斯·施瓦兹

Maryam,确保sort_nat。m在MATLAB路径中的一个文件夹中。你可以通过“doc path”阅读更多关于路径的信息。

马里亚姆

您好。我想用这个程序对名称中有数值的向量a字符串进行排序。我给出了一个错误:未定义函数“sort_nat”,用于“cell”类型的输入参数

我该怎么办?

Morad卡塞姆

谢尔盖,
这不是窃听器,但你可能不同意我的逻辑。记住,我们是在排序字符串,而不是数字。'01'在'1'后面,因为它们有相同的数值,但'01'是一个更长的字符串。同样,'000'出现在'00'后面,等等。
通过更改正则表达式(当前仅查找带有“\d+”的数字行),可以包含“+-”。

哔叽

很快!我打不过它!

这可能是个bug,不确定?
sort_nat ({01 e2的‘1 e3})
ans = '1E3' '01E2'

我想出了一个可以治疗'+- '的方法。,' as part of the number, but its 10x slower. Not sure if sort_nat can be extended to do same.

亚历克斯

非常感谢!
我输入的是C=[list.name],而不是
C={list.name}是右边的。
再次非常感谢!
非常有用的功能!

道格拉斯·施瓦兹

Alex,你的输入必须是一个单元格数组:

>>C={'1.bmp','10.bmp','11.bmp','2.bmp'};
> > sort_nat (C)
ans =
“1.bmp”“2.bmp”“10.bmp”“11.bmp”

亚历克斯

亚历克斯

我发现这个很有用,但我不能使用它。

C =

1. bmp10.bmp11.bmp2.bmp

>> [S,INDEX] = sort_nat(C)

来自非单元格数组对象的单元格内容引用。

排序时出错(第62行)

num_val(我,z(我,:))= sscanf (sprintf(“% s”,digruns{我}{:}),' % f ');

任何帮助吗?

已看到

很有用的-工作的描述!谢谢。

嘉达

它工作得很好,帮助很大。太棒了!!!
谢谢你!

德克

非常感谢,节省了我很多时间!德克

保罗

欧文

易隋

格雷戈里

彼得Beemiller

Ekaterina

对不起,我是MATLAB的初学者,我不确定这些函数的输入参数是什么意思。有很多输入参数....我有一个struct数组(由名称为ex.123_1, 123_2等的文件组成)a <3000*1> struct,我想根据存在的文件名称对它进行排序。我该如何使用这个函数…请帮我. .最好的各种卡蒂亚

的萨尔瓦多有些

非常感谢! !伟大的

哈瑞年代

优秀的

Nopparat

Muhammet

迦勒

正合我意,谢谢!

沙米尔·阿拉维

在我浏览这段代码之前,我已经浪费了很多时间,试图为我的图像处理项目正确地排序我的图像文件。而mathworks的网络教程在这方面是完全有缺陷的。伟大的工作!当然值得五星评价。

达蒙·布拉德利

出色的工作。在美国宇航局做一些数据分析,为我节省了很多时间和头痛。谢谢!

达蒙·布拉德利

这是伟大的!最好将其包含在Matlab中!

约翰娜

小君

非常感谢,节省我的时间和精力来编写我自己的代码来解决这个问题

Carsten

埃德温•卡特

很好,在八度音阶下也能直接工作。

Evgeny公关

道格拉斯•施瓦兹
您为不区分大小写的排序提供了完美的解决方案。
谢谢你!

道格拉斯·施瓦兹

Evgeny,你一定是第一个使用降序和索引的人。你说得很对,这是一个bug,我感谢你识别它。我用一种稍微不同的方式修复了它,刚刚上传了新版本。

要实现不区分大小写的排序,你可以这样做:
c = {'a1', 'a2', 'a10', 'b1', 'X1', 'a10'};
(未使用、索引)= sort_nat(低(c));
c = c(指数);

我希望sort_nat的工作方式与sort相同,因为sort不区分大小写,所以我也将其排除在sort_nat之外。

当做
道格

Evgeny公关

这段代码并不完全正确:
如果strcmpi(模式中,“提升”)
c = c(指数);
其他的
c = c(指数(结束:1:1));
结束

输出参数索引不随排序顺序而变化。

最好这样做:
如果strcmpi(模式中,“下”)
指数= flipud(指数);
结束
c = c(指数);
Index =重塑(Index, size(cs));%与C数组维数相同

Evgeny公关

您好!非常好的功能和编码!
我无法写出如此优雅和快速的函数。:)

一个问题:
您不想使排序模式不区分大小写吗?

例如:
c = {'a1', 'a2', 'a10', 'b1', 'X1', 'a10'}

Case-sensetive排序:
cs = {'A10', 'X1', 'a1', 'a2', 'A10', 'b1'}

不区分大小写:
cs = {'a1', 'a2', 'a10', 'a10', 'b1', 'X1'}

奥斯卡

皮特

优秀的五星级。

我想我遇到了降序排序的需要,因为我想在各种文件中搜索它们的名称中带有时间戳的最新条目。

无论如何,干得好。

Pete,我不确定降序排序是否经常使用,但正如你所说的,它很容易添加,为什么不呢?我选择了一种稍微不同的方法,但它是你想要的方式。谢谢你的建议。更新应该很快就会出现。

皮特

干得好。

是只有我这样想,还是说这对指明方向没有好处?这很简单:

Function [cs,index] = sort_nat(c,varargin)

…<整个代码>

如果输入参数个数> 1
如果strcmpi(varargin{1},'down')
指数= flipud(指数);
c = c(指数);
结束
结束

亚当贝克

我要是早点发现就好了!

格雷格•费希特

漂亮的,谢谢。

尼古拉Toljic

谢谢

徐刚

好了!谢谢

汉斯·冯·迪克

太好了,正是我需要的。

F Moisy

完美的。应该包括在R2007a!

迈克·帕伦博

很好,比交换中的另一个文件"sortn"好多了,sortn在尝试排序6000多个字符串时冻结了,这个排序在大约一秒内就完成了。

MATLAB版本兼容性
创建R14SP2
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!