矩阵操作以提取某些子列

时间:2015-05-22 08:33:11

标签: matlab matrix cell-array

M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
      552   552   300   552   300   552   431  431  431 124 124 ; 
     2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
        7    12    25    15    12    30     2   10   55  32  12]

X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12]}

A = [1007  4044  5002  622
      552   300   431  124
     2010  1113  1100   88
        7    25     2   32
       12    12    10   12
       15          55
       30                 ]

A是解释我想要的内容的实体。

A包含M(1:3,:)的唯一列向量,以及M(4,:)

中的相应值
A(1:3,:) = unique(M(1:3,:)','rows')'

我希望找到A(1:3,:)的列向量,其M(4,:)中的对应值不属于单元格X的一个向量的一部分(显然不等于其中一个这些载体)。

对于我的例子,期望的结果是矩阵:

 [1007  4044; 
   552   300; 
  2010  1113;]

已删除列向量[5002;431;1100],因为[2;10;55]中包含X{2} = [2 10 55 9 17]

已删除列向量[622;124;88],因为[32 12] = X{4}

1 个答案:

答案 0 :(得分:1)

<强>输入

M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
      552   552   300   552   300   552   431  431  431 124 124; 
     2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
        7    12    25    15    12    30     2   10   55  32  12];

X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12]};

这样做(你做了什么)

A(1:3,:) = unique(M(1:3,:).','rows').';

给出:

>> A

A =

     622        1007        4044        5002
     124         552         300         431
      88        2010        1113        1100

然后使用uniqueaccumarray

[~, ~, subs] = unique(M(1:3,:)','rows');

A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});

现在我们将A4作为单元格数组

>> A4

A4 = 

[2x1 double]    [4x1 double]    [2x1 double]    [3x1 double]

然后使用cellfunismemberallany

%// getting a mask of which columns we want
idxC(length(A4)) = false;
for ii = 1:length(A4)
    idxC(ii) = ~any(cellfun(@(x) all(ismember(A4{ii},x)), X));
end

显示我们想要的列

out = A(:,idxC)

<强>结果:

>> out

out =

    1007        4044
     552         300
    2010        1113

我建议你亲自试试@Dan建议。如果你被困在某个地方,你可以参考这个。如果您有任何澄清/修改,请告诉我:))