在 MATLAB 中对数组的分区进行排序

Sort a partition of an array in MATLAB

我有以下大小为 1x9

的元胞数组 A
A= {{'O1'} ,{'O1','O2','O3','O4'} ,{'O1','O3'} ,{'O1','O2','O3','O4'} , {},{'O1','O2','O3','O4'},{'O1','O3'},{'O1','O2','O3','O4'},{'O1','O2','O3','O4'}};

我想根据单元格中元素的数量,从第五个元素 A{5:9} 开始对该单元格数组的分区进行排序。我已经尝试了 sort 函数,但似乎没有用

[P,I] = sort(cellfun('length',A{5:9}));
A = A(I);

还有什么方法可以在排序后跟踪 cellarray 的原始索引?

可以通过以下代码进行排序/

A= {{'O1'} ,{'O1','O2','O3','O4'} ,{'O1','O3'} ,{'O1','O2','O3','O4'} , {},

{'O1','O2','O3','O4'},{'O1','O3'},{'O1','O2','O3','O4'},{'O1','O2','O3','O4'}};
disp('Before sorting')
for ii = 1:numel(A)
    fprintf('%d: %s\n',ii, cell2str(A{ii}));
end
a=A(5:end);
[P,I] = sort( cellfun(@(x) numel(x),a) );
A(5:end) = a(I);
clear a

disp('After sorting')
for ii = 1:numel(A)
    fprintf('%d: %s\n',ii, cell2str(A{ii}));
end

可以再次使用 I:

找到元胞数组的初始顺序和最终顺序之间的映射
originalOrder = 1:numel(A);
finalOrder    = originalOrder;
o = originalOrder(5:end);
finalOrder(5:end) = o(I);
clear o

你的情况:finalOrder = [1 2 3 4 5 7 6 8 9] 单元格 6 在修改后的 A 中的原始位置是 finalOrder(6) = 7.