编者按:这个文件被选为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中心文件交换.
受到启发的:BiofilmQ,基于二维数字图像相关数据的景深计算器,可定制的自然顺序排序,philipptempel/matlab项目管理,自然顺序行排序,自然顺序文件名排序,Lilo:快速且像素精确的2D瓷砖拼接,KANTOO,DETEQT
做得好,非常感谢!
伟大的工作,
它将解决图像处理应用开发中的许多问题。
非常感谢!!!!
非常感谢,看似简单的处理,但是却解决了让人很头疼的问题!!
伟大的服从,这在我的许多剧本中是必须的。如果你碰巧需要在字符串中使用这个,你可以尝试用'\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的必备函数。
很有用,谢谢! !
这是一个非常棒的工具。谢谢!
超级方便的
由于道格拉斯
Antonio,这个页面是我提交的,sort_nat。natsort和NatsortFile是其他作者提交的。搜索它们。
我正在使用2016a Matlab版本,我没有找到这个函数:natsort, natsortfiles
请帮帮我!!!!!!!!!
非常有用!谢谢!
谢谢!
正是我所需要的,很棒的工具!非常感谢!:)
这正是我需要的!
非常感谢:-)
漂亮和整洁!
非常好的工具,谢谢!
太好了,谢谢。祝你今天愉快:)
在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)给我错误说“太多的输入参数”
谢谢! !
太棒了!工作完美无瑕,节省了一些电子工程师的时间。谢谢!
使用诸如“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”类型的输入参数
我该怎么办?
谢尔盖,
这不是窃听器,但你可能不同意我的逻辑。记住,我们是在排序字符串,而不是数字。'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 ');
任何帮助吗?
很有用的-工作的描述!谢谢。
它工作得很好,帮助很大。太棒了!!!
谢谢你!
非常感谢,节省了我很多时间!德克
对不起,我是MATLAB的初学者,我不确定这些函数的输入参数是什么意思。有很多输入参数....我有一个struct数组(由名称为ex.123_1, 123_2等的文件组成)a <3000*1> struct,我想根据存在的文件名称对它进行排序。我该如何使用这个函数…请帮我. .最好的各种卡蒂亚
非常感谢! !伟大的
优秀的
正合我意,谢谢!
在我浏览这段代码之前,我已经浪费了很多时间,试图为我的图像处理项目正确地排序我的图像文件。而mathworks的网络教程在这方面是完全有缺陷的。伟大的工作!当然值得五星评价。
出色的工作。在美国宇航局做一些数据分析,为我节省了很多时间和头痛。谢谢!
这是伟大的!最好将其包含在Matlab中!
非常感谢,节省我的时间和精力来编写我自己的代码来解决这个问题
很好,在八度音阶下也能直接工作。
道格拉斯•施瓦兹
您为不区分大小写的排序提供了完美的解决方案。
谢谢你!
Evgeny,你一定是第一个使用降序和索引的人。你说得很对,这是一个bug,我感谢你识别它。我用一种稍微不同的方式修复了它,刚刚上传了新版本。
要实现不区分大小写的排序,你可以这样做:
c = {'a1', 'a2', 'a10', 'b1', 'X1', 'a10'};
(未使用、索引)= sort_nat(低(c));
c = c(指数);
我希望sort_nat的工作方式与sort相同,因为sort不区分大小写,所以我也将其排除在sort_nat之外。
当做
道格
这段代码并不完全正确:
如果strcmpi(模式中,“提升”)
c = c(指数);
其他的
c = c(指数(结束:1:1));
结束
输出参数索引不随排序顺序而变化。
最好这样做:
如果strcmpi(模式中,“下”)
指数= flipud(指数);
结束
c = c(指数);
Index =重塑(Index, size(cs));%与C数组维数相同
您好!非常好的功能和编码!
我无法写出如此优雅和快速的函数。:)
一个问题:
您不想使排序模式不区分大小写吗?
例如:
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(指数);
结束
结束
我要是早点发现就好了!
漂亮的,谢谢。
谢谢
好了!谢谢
太好了,正是我需要的。
完美的。应该包括在R2007a!
很好,比交换中的另一个文件"sortn"好多了,sortn在尝试排序6000多个字符串时冻结了,这个排序在大约一秒内就完成了。