根据公共列元素重新排列行

时间:2016-04-01 07:27:51

标签: matlab

例如给出矩阵

A = [20 1  2  3;
     3  3  3  4];

B = [3  3  3  3;
     20 1  2  4];    

矩阵A的每列都有一个共同的元素。是否可以不使用for循环重新排列A行,以使公共元素位于顶行或底行(参见矩阵B)?

1 个答案:

答案 0 :(得分:2)

我建议您使用Oleg提交的Set functions with multiple inputs文件交换来查找常用元素。首先使用Amat2cell转换为列向量的单元格数组。然后使用{:}表示法将其分成逗号分隔列表,将每列提供给intersectm(来自上面链接的FEX条目)作为单独的输入

A_cell = mat2cell(A,2,ones(1,size(A,2)));
common = intersectm(A_cell{:});

现在找到每列中公共元素所在的行,并使用线性索引来翻转公共元素在第二行中的列

[r, c] = find(A == common);
idx_r = (r+c*2-2)';
idx = idx_r;
idx(2,:) = (idx_r-1).*~mod(idx_r,2) + (idx_r+1).*mod(idx_r,2);

最后

B = A(idx)