例如给出矩阵
A = [20 1 2 3;
3 3 3 4];
B = [3 3 3 3;
20 1 2 4];
矩阵A
的每列都有一个共同的元素。是否可以不使用for循环重新排列A
行,以使公共元素位于顶行或底行(参见矩阵B
)?
答案 0 :(得分:2)
我建议您使用Oleg提交的Set functions with multiple inputs文件交换来查找常用元素。首先使用A
将mat2cell
转换为列向量的单元格数组。然后使用{:}
表示法将其分成逗号分隔列表,将每列提供给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)