2015-04-06 2 views
0

M представляет собой матрица 4x2000000 состоит из нескольких подматриц Ai таким образом, что Ai(1:3,j) тот же вектор для j = 1,...,size(Ai,2). и Ai(4,j) - значения между 1 и 100.снижение матриц при определенных условиях

V = [2 15 21 43] 

моя цель состоит в том, чтобы устранить все подматрицам Ai из M, если Ai(4,:) не содержит все значения из V.

Единственные исходные данные для этой задачи являются M и V

Пример:

M = [1022 3001 4451 1022 1022 3001 1022 3001 3001 1022; 
     112 45 10 112 112 45 11 45 99 112; 
     500 11 55 500 500 11 88 11 1 500; 
     2  6  3 5 71  2 2 71 5 88] 

A1 = [1022 1022 1022 1022; 
     112 112 112 112; 
     500 500 500 500; 
     2 5 71 88] 

A2 = [3001 3001 3001; 
     45 45 45; 
     11 11 11; 
     6 2 71] 

A3 = [4451; 
     10; 
     55; 
     3] 

A4 = [1022; 
     11; 
     88; 
     2] 

A5 =[3001; 
     99; 
     1; 
     5] 

если V = [2 71]

Ожидаемый выход (порядок столбцов не важен):

[1022 1022 1022 1022 3001 3001 3001; 
    112 112 112 112 45 45 45; 
    500 500 500 500 11 11 11; 
    2 5 71 88 6 2 71] 
+0

Все значения или любые значения? – Divakar

+0

@Divakar: все значения – bzak

+0

Опубликовать образец входных данных и ожидаемого выхода? – Divakar

ответ

3

Один подход -

[~,~,idx] = unique(M(1:3,:)','rows') %//' 
valid = ismember(M(4,:),V) 
valid_idx = accumarray(idx(valid),M(4,valid).',[],@(x) ... 
           numel(unique(x)))>=numel(V) %//' 
out = M(:,ismember(idx,find(valid_idx))) 
+1

Мне особенно нравится второй! –

+0

@ Дивакар: Большое спасибо Дивакар. – bzak

+0

@bzak Была ошибка, исправлено это. В принципе, если в четвертой строке в пятой колонке было что-то другое, чем '71', все равно рассматривалось значение« A1 », что было неправильно. Теперь все хорошо! – Divakar

Смежные вопросы