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
答案 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];
相同的正值表示&
,相同的负值表示|
。不同的值表示不同的条目。
我希望你能从这里开始。