从Malab中的矩阵高效创建数组

时间:2017-03-25 10:03:52

标签: matlab matrix

我有这个矩阵一个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 

2 个答案:

答案 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可以设置为firstlast,以查找重复值的第一个/最后一个匹配项的索引。 对于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