Matlab 对表行和列重新排序
我有一张5x5的桌子: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
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的提示。如果你不介意的话,我会把它包括在答案中?@excazaNewOrder
不可能是一个页眉列表而不是索引?@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