我有这个矩阵一个N×3矩阵,比如说A
A =
2 3 9
7 1 2
5 4 7
14 15 13
13 10 9
8 6 5
11 8 10
16 12 11
我想构建一个2N x 2阵列,比如b。该阵列在行2,3和9中具有值1,即A(1,:)= [2 3 9]。在行7中,1和2具有值2,即A(2,:) = [7 1 2],依此类推。输出必须是,
b =
2 0
1 2
1 0
3 0
3 6
6 0
2 3
6 7
1 5
5 7
7 8
8 0
4 5
4 0
4 0
8 0
答案 0 :(得分:0)
我认为这就是你想要的:
A = [2 3 9;
7 1 2;
5 4 7;
14 15 13;
13 10 9;
8 6 5;
11 8 10;
16 12 11];
[~,Aidxs1,~] = unique(A,'stable');
Aidxs2 = find(~ismember(1:numel(A),Aidxs1));
[row1,~] = ind2sub(size(A),Aidxs1);
[row2,~] = ind2sub(size(A),Aidxs2);
Bidxs1 = A(Aidxs1);
Bidxs2 = A(Aidxs2);
B = zeros(2*size(A,1),2);
B(Bidxs1,1) = row1;
B(Bidxs2,2) = row2;
然后你有:
B = [2 0
1 2
1 0
3 0
3 6
6 0
2 3
6 7
1 5
5 7
7 8
8 0
5 4
4 0
4 0
8 0]
答案 1 :(得分:0)
unique
函数的occurrence flag
可以设置为first
或last
,以查找重复值的第一个/最后一个匹配项的索引。
对于b
的第一列,我们需要索引到第一次出现的行和第二列,如果有重复值,我们需要索引到第二次(最后)出现的行。
% transpose A to find elemnts row-wise
[~,idx1] = unique(A.','first');
%convert linear index to row index
b(:,1) = ceil(idx1/size(A,2));
[~,idx2] = unique(A.','last');
% if there is a repeated value we need index of the last occurrence
AC = accumarray(A(:),1)>1;
b(AC,2) = ceil(idx2(AC)/size(A,2));
b =
2 0
1 2
1 0
3 0
3 6
6 0
2 3
6 7
1 5
5 7
7 8
8 0
4 5
4 0
4 0
8 0