Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Matlab中的第二列对具有相同编号的第一列排序?_Matlab - Fatal编程技术网

根据Matlab中的第二列对具有相同编号的第一列排序?

根据Matlab中的第二列对具有相同编号的第一列排序?,matlab,Matlab,我有一组数据,并要求Matlab按如下升序排序 filename=input('Type filename.txt: ','s'); fid=fopen(filename); mydata=textscan(fid,'%f %c','headerlines', 1, 'delimiter','\t'); fclose(fid); % sort data [mydata{1},idx] = sort(mydata{1}) mydata{2} = mydata{2}(idx) 数据如下: 0.

我有一组数据,并要求Matlab按如下升序排序

filename=input('Type filename.txt: ','s');
fid=fopen(filename);
mydata=textscan(fid,'%f %c','headerlines', 1, 'delimiter','\t');
fclose(fid);

% sort data
[mydata{1},idx] = sort(mydata{1})
mydata{2} =  mydata{2}(idx)
数据如下:

0.41    U
0.41    U
0.41    U
0.41    D
0.41    U
0.41    D
0.41    U
0.41    U
0.41    D
0.41    U
0.42    U
0.42    D
0.42    U
0.42    U
0.42    U
0.42    D
0.43    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    D
0.41    D
0.41    D
0.42    U
0.42    U
0.42    U
0.42    U
0.42    D
0.42    D
0.43    U
U=未检测到,D=检测到。如果您仔细注意,如果第一列有相同的数字,比如0.41,Matlab将对第一列进行排序,而忽略第二列的顺序。我想让Matlab做的是,如果它在第一列中看到相同的数字,那么将数字放在第二列的基础上,U放在D之前。
最终排序的数据如下所示:

0.41    U
0.41    U
0.41    U
0.41    D
0.41    U
0.41    D
0.41    U
0.41    U
0.41    D
0.41    U
0.42    U
0.42    D
0.42    U
0.42    U
0.42    U
0.42    D
0.43    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    U
0.41    D
0.41    D
0.41    D
0.42    U
0.42    U
0.42    U
0.42    U
0.42    D
0.42    D
0.43    U
如果能让它变得更简单,我可以让1=检测,0=不检测 谢谢你的帮助和时间

编辑:我还应该补充一点,sortrow不起作用,因为我想保留数据结构,以便下面的代码可以遵循

o=mydata{1} %index the first column of the array mydata


c = zeros(size(mydata,1),1); % preallocate empty matrix 
c = mydata{2} == 'U';
for i = 1:size(mydata,1)
 curValue = mydata{i,2};
 data{i,3} =  ~isempty(curValue) && ischar(curValue) && strcmp(curValue ,'U');

结束

我现在没有MATLAB的副本,所以我无法验证代码,但我相信MATLAB的排序算法是正确的。因此,如果您在第二列排序,然后在第一列排序,您应该得到您想要的


也就是说,在第一次排序之后(在第二列上),所有“U”将分组在一起,所有“D”将分组在一起。然后,即使在第二次排序(在第一列上)之后,U和D仍将为每个数值组分组。

您可以使用
sortrows
,但您必须首先将
mydata
转换为一个n×2单元格数组:

mydata = [num2cell(mydata{1}),num2cell(mydata{2})];

cs = sortrows(mydata,[1,-2]) %# sort the first col ascending, then second descending
cs = 
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'U'
    [0.41]    'D'
    [0.41]    'D'
    [0.41]    'D'
    [0.42]    'U'
    [0.42]    'U'
    [0.42]    'U'
    [0.42]    'U'
    [0.42]    'D'
    [0.42]    'D'
    [0.43]    'U'
您可以通过调用

mydataSorted = {cat(1,cs{:,1}),cat(1,cs{:,2})};

显然,如果您转换数据,使
mydata{2}
是数字的,您可以简单地放弃单元格数组,直接调用
sortrows

请发布您的数据,以便更好地理解问题。它的可能副本实际上是该帖子的扩展。尝试了sortrows后出现此错误。mydata=[47x1双精度][47x1字符]???索引超过了矩阵维度。在137 ndx=ndx(ind)处将单元格向后排序到前面时出错==>sortrows>sort\u;错误==>sortrows在90 ndx=将单元格向后排序到前面(x\u sub,col)@TranHuynh:我首先添加了我如何转换
mydata
的行,以使
sortrows
工作。