Matlab 对表行和列重新排序

Matlab 对表行和列重新排序,matlab,Matlab,我有一张5x5的桌子: a b c d e a 1 2 3 4 5 b 3 5 7 2 6 c 1 3 4 6 1 d 4 4 1 7 8 e 6 7 2 1 6 其中标题是字符串。 我想知道如何使用标题对表的行和列重新排序 例如,我希望它们的顺序是这样的 e b c a d e 6 7 2 6 1 b 6 5 7 3 2 c 1 3 4 1 6 a 5 7 3 1 4 d 8 4 1 4

我有一张5x5的桌子:

  a  b  c  d  e
a 1  2  3  4  5
b 3  5  7  2  6
c 1  3  4  6  1
d 4  4  1  7  8
e 6  7  2  1  6
其中标题是字符串。 我想知道如何使用标题对表的行和列重新排序 例如,我希望它们的顺序是这样的

  e  b  c  a  d
e 6  7  2  6  1
b 6  5  7  3  2
c 1  3  4  1  6
a 5  7  3  1  4
d 8  4  1  4  7

下面是一种使用索引的方法。您确实可以像对任何数组一样,使用索引重新排列行和列。在本例中,我将
标题
数组中的每个字母替换为一个数字(原来是
[1 2 3 4 5]
),然后使用定义新顺序的向量
[5 2 3 1 4]
,对表重新排序。在处理较大的表时,您可以制作某种查找表来自动执行此操作:

clc
clear


a = [1  2  3  4  5;
 3  5  7  2  6;
 1  3  4  6  1;
 4  4  1  7  8;
 6  7  2  1  6];

headers = {'a' 'b' 'c' 'd' 'e'};

%// Original order. Not used but useful to understand the idea... I think :)
OriginalOrder = 1:5;

%// New order
NewOrder = [5 2 3 1 4];

%// Create table
t = table(a(:,1),a(:,2),a(:,3),a(:,4),a(:,5),'RowNames',headers,'VariableNames',headers)
作为使用函数
table
手动创建表的一种较简单的替代方法,您可以使用函数
array2table
(多亏@excaza),这节省了几个步骤:

t = array2table(a,'RowNames',headers,'VariableNames',headers)
无论采用哪种方式,请使用新索引重新排列表格:

New_t = t(NewOrder,NewOrder)
输出:

t = 

         a    b    c    d    e
         _    _    _    _    _

    a    1    2    3    4    5
    b    3    5    7    2    6
    c    1    3    4    6    1
    d    4    4    1    7    8
    e    6    7    2    1    6


New_t = 

         e    b    c    a    d
         _    _    _    _    _

    e    6    7    2    6    1
    b    6    5    7    3    2
    c    1    3    4    1    6
    a    5    2    3    1    4
    d    8    4    1    4    7

将该表定义为

T = table;
T.a = [1 3 1 4 6].';
T.b = [2 5 3 4 7].';
T.c = [3 7 4 1 2].';
T.d = [4 2 6 7 1].';
T.e = [5 6 1 8 6].';
并让新的期望顺序

order = {'e' 'b' 'c' 'a' 'd'};
仅使用索引即可对表重新排序:

[~, ind] = ismember(order, T.Properties.VariableNames);
T_reordered = T(ind,order);
请注意:

  • 要仅对列进行重新排序,请使用
    T\u reorderedCols=T(:,order)
  • 要仅对行进行重新排序,可以使用
    T_reorderedRows=T(ind,:)
所以在这个例子中

T = 

    a    b    c    d    e
    _    _    _    _    _

    1    2    3    4    5
    3    5    7    2    6
    1    3    4    6    1
    4    4    1    7    8
    6    7    2    1    6

T_reordered = 

    e    b    c    a    d
    _    _    _    _    _

    6    7    2    6    1
    6    5    7    3    2
    1    3    4    1    6
    5    2    3    1    4
    8    4    1    4    7

“表”是指“矩阵”吗?不,我指的是
。我现在正在检查发布的答案。您可以使用
array2table(a,'RowNames',headers,'VariableNames',headers)
而不是
table
来节省一点打字时间。谢谢@excaza的提示。如果你不介意的话,我会把它包括在答案中?@excaza
NewOrder
不可能是一个页眉列表而不是索引?@shepherd你可以使用页眉/页脚名称的单元格数组为MATLAB表编制索引。e、 g.
other\u new\u t=t({'e','b','c','a','d'},{'e','b','c','a','d'})
但是也有行的头。我非常喜欢这个实现,很好地使用了
ismember
和表的属性。是的,非常好@LuisMendo我学到了一些东西(再一次)谢谢!看到您编写的超过20字节的答案令人耳目一新;)这正是我要找的,尤其是“仅列”注释。@Giuseppe:-)有趣的是,我从来没有在我的普通Matlab代码中使用过
table
s