我有一个包含多行的文本文件,每行包含字符串和浮点数,
%s1 %s1 %s1 %f1 %f1 %f1
%s2 %s2 %s2 %f2 %f2 %f2
在我的函数中,我需要根据单个列中的一个浮点数对这些行进行排序,假设如果f2< F1。我知道我可以使用
sort
但我不知道如何把剩下的线路带到新的位置。
答案 0 :(得分:1)
假设您有两个向量x1和x2。你想按x1排序。
[sorted_version_1, I] = sort(x1);
sorted_version_2 = x1(I);
% sorted_version_1 == sorted_version_2, both sorts of x2
sorted_x2 = x2(I)
如果您有字符串,则数据结构可能不同,您可能必须使用{}而不是()才能使其工作
答案 1 :(得分:0)
要解析字符串和浮点数,您可以使用textscan(fileid, '%s %s %s %f %f %f')
。它返回一个单元格数组。您需要的浮点数据矩阵可以使用单元格数组的最后三个单元格形成。
然后,您可以使用sort(matrix, 2)
对行进行排序。
如果要重写文本文件,则在其上覆盖已处理的数据。要写入文件,您可以使用fprintf(fileid, '%s %s %s %f %f %f', elements_of_a_row)
答案 2 :(得分:0)
sortrows
函数旨在处理此问题并适用于单元格数组:
sortrows(X,COL)
根据中指定的列对矩阵进行排序 向量COL
。
假设您将数据表T
格式化为单元格。例如,这个随机数据:
>> T = [mat2cell(char(randi(26,4,3)+64),ones(4,1),ones(3,1)) num2cell(rand(4,3))]
T =
'W' 'M' 'D' [0.5795] [0.1008] [0.1439]
'Z' 'X' 'S' [0.1030] [0.5029] [0.3192]
'R' 'I' 'U' [0.3553] [0.4873] [0.4491]
'L' 'I' 'U' [0.9389] [0.7817] [0.0499]
按照第4列按升序排序:
>> TSortedCol4 = sortrows(T,4)
TSortedCol4 =
'Z' 'X' 'S' [0.1030] [0.5029] [0.3192]
'R' 'I' 'U' [0.3553] [0.4873] [0.4491]
'W' 'M' 'D' [0.5795] [0.1008] [0.1439]
'L' 'I' 'U' [0.9389] [0.7817] [0.0499]
如果您需要从文本文件中获取上述T
格式的数据,可以执行以下操作来阅读并重新格式化:
fid = fopen('testtable.txt','r');
Tin = textscan(fid, '%q %q %q %f %f %f'); % each column has a cell
strcols=cellfun(@iscell,Tin);
T = [Tin{strcols} num2cell([Tin{~strcols}])]; % each item has a cell
fclose(fid);
如您的示例所示,列由空格分隔。如果由于%q
格式说明符而在文本文件中使用双引号,则字符串可以包含空格。