Matlab:我如何在矩阵A上进行这种转换? (第2部分)

时间:2014-11-04 19:30:02

标签: matlab matrix

N.B:这个问题比我上一个问题更复杂:Matlab: How I can make this transformation on the matrix A?

我有一个矩阵A 4x10000,我希望根据预定义的向量U使用它来查找另一个矩阵C

我将通过一个简单的例子简化我的问题:

来自矩阵A

20     4     4    74    20    20    4  
36     1     1    11    36    36    1     
77     1     1    15    77    77    1    
 3     4     2     6     7     8   15  

U=[2 3 4 6 7 8 2&4&15 7&8 4|6]

& : AND

| : OR

我想首先找到一个中间实体B

               2     3     4     6     7    8     2&4&15    7&8     4|6

[20 36 77]     0     1     0     0     1    1       0        1       0       4

[4   1  1]     1     0     1     0     0    0       1        0       1       4

[74 11 15]     0     0     0     1     0    0       0        0       1       2

如果第一行的对应值和左边的向量,我们放1,在矩阵A中创建一列。

实体B的最后一列是每行1的总和。

最后我想要一个矩阵C,由实体B中的向量组成,但前提是1的总和大于或等于3.

我的例子:

     20  4
C =  36  1
     77  1

2 个答案:

答案 0 :(得分:1)

这确实很复杂,并且由于涉及许多限制和标记过程,它不会像上一个问题的解决方案那样有效。这是解决已发布问题的代码 -

find_labels1 = 2:8; %// Labels to be detected - main block
find_labels2 = {[2 4 15],[7 8],[4 6]}; %// ... side block
A1 = A(1:end-1,:); %// all of A except the last row
A2 = A(end,:); %// last row of A

%// Find unique columns and their labels for all of A execpt the last row
[unqmat_notinorder,row_ind,inv_labels] = unique(A1.','rows'); %//'
[tmp_sortedval,ordered_ind] = sort(row_ind);
unqcols = unqmat_notinorder(ordered_ind,:);
[tmp_matches,labels] = ismember(inv_labels,ordered_ind);

%// Assign labels to each group
ctl = numel(unique(labels));
labelgrp = arrayfun(@(x) find(labels==x),1:ctl,'un',0);

%// Work for the main comparisons
matches = bsxfun(@eq,A2,find_labels1'); %//'
maincols = zeros(ctl,numel(find_labels1));
for k = 1:ctl
    maincols(k,:) = any(matches(:,labelgrp{k}),2);
end

%// Work for the extra comparisons added that made this problem extra-complex
lens = cellfun('length',find_labels2);
lens(end) = 1;
extcols = nan(ctl,numel(find_labels2));
for k = 1:numel(find_labels2)
    idx = find(ismember(A2,find_labels2{k}));
    extcols(:,k)=arrayfun(@(n) sum(ismember(labelgrp{n},idx))>=lens(k),1:ctl).'; %//'
end
C = unqcols(sum([maincols extcols],2)>=3,:).' %//'# Finally the output

答案 1 :(得分:0)

我会给你一个部分答案。我想你可以从这里拿走。想法是将A的前三行连接起来,将U的每个元素复制为最后一列。获得3D矩阵后,复制原始A,然后只比较行。相等的行,相当于在表中放置one

B=(A(1:3,:).';
B1=repmat(B,[1 1 length(U)]);
C=permute(U,[3 1 2]);
D=repmat(C,[size(B1,1),1,1]);
E=[B1 D];
F=repmat(A',[1 1 size(E,3)]);

现在比较F和E,逐行。如果行相等,则将1放在表中。要复制&|,您可以形成某种指标向量。

说,

indU=[1 2 3 4 5 6 7 7 7 8 8 -9 -9];

相同的正值表示&,相同的负值表示|。不同的值表示不同的条目。

我希望你能从这里开始。