2015-05-18 4 views
4

Скажет, у меня есть следующий:Фильтровать матрицу по нескольким значениям столбцов без петель (Matlab)?

  • матрица данных М (мп матрицы с размерностью);
  • совпадающей строки V (п матрицу с размерностью);
  • позиция Matching Я (п матрицы с размерностью логической);

Я хочу, чтобы фильтровать все строки M, которые имеют то же значение, как V в положениях, совпадающих я. Я считаю, что индексирование Matlab достаточно мощное, чтобы сделать это без циклов. Но как?


Текущее решение: бежать, хотя все столбцы и обновлять отфильтрованные позиции строки F (м1 матрицу с размерностью логично).

F = true(m,1); 
for k = 1:n; 
    if I(k); 
     F = F & (M(:,k)==V(k)); 
    end; 
end; 
M = M(F,:); 

ответ

1

Вот один из способов:

result = M(all(bsxfun(@eq, M(:,I), V(I)), 2), :); 

Как это работает

Каждая строка M(:,I) сравнивается поэлементно с вектором строки V(I) использованием bsxfun. Выбираются строки, для которых выбрано совпадение столбцов . Полученный логический вектор используется для индексации строк M.

Пример

M = [ 8  3  6  9 
     5  4  9  8 
     8  9  6  9 ]; 
I = [ true false true true ]; 
V = [ 8 1  6  9 ]; 

>> result = M(all(bsxfun(@eq, M(:,I), V(I)), 2), :) 
result = 
    8  3  6  9 
    8  9  6  9 
+0

Спасибо, это хороший и лаконичный ответ! – Pranasas

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