%% Фильтрация данных
%
%
%% Логические переменные и операции над ними
% Ранее логический тип данных был рассмотрен поверхностно.
% Данные логического типа могут принимать только два значения: true (логическая 1) и false (логический 0). Логические переменные могут быть заданы вручную, так и могут являться результатом сравнений:
%

L1 = true
X = 4;
L2 = X==3

% Остальные операторы численного сравнения представлены в таблице:
%
% Сравнивать можно не только числа и численные переменные, но и строки (String). Функции сравнения строк представлены в таблице:
%
% Пример:

Str1 = "добрый"
[strcmp(Str1,"добрый"), strcmp(Str1,"Добрый"),strcmpi(Str1,"Добрый")]
Str2 = "Добрый вечер";
Str3 = "добрый день";
strncmp(Str1,Str3,6)    % проверяет на равенство 6 первых символов
strncmp(Str2,Str3,6)    % без игнорирования регистра
strncmpi(Str2,Str3,6)   % с игнорированием регистра

% Над логическими переменными справеливы логические операции и функции, приведённые в таблице:
%
% Матрица из логических переменных может быть получена в результате операций сравнения двух числовых матриц одинакового размера:
%
% Пример:

M1 = randi([0,12],5,6)
M2 = randi([0,12],5,6)
L3 = M1>M2

% То же справедливо и для векторов.
%
%% Фильтрация данных по условию
% Для нахождения данных по заданному условию может использоваться функция find. Она возвращает местонахождение (адреса) удовлетворяющих условию компонент. В случае вектора результатом будет вектор адресов:
%
% В случае матриц будет возвращено два вектора адресов: по строкам и колонкам:
%
% Пример:

L3
[r,c] = find(L3);
[r,c]

% Чтобы найти количество удовлетворяющих условию элементов в матрице по столбцам или строкам (в зависимости от выбранного параметра Dimension) используется уже рассмотренная ранее функция sum, а для поиска общего количества удовлетворяющих условию компонент используется команда nnz:
%

sum(L3)     % по столбцам, по умолчанию
sum(L3,2)   % по строкам, Dimension = 2
nnz(L3)     % общее количество удовлетворяющих условию компонент

%
%% Логическое индексирование
% Ранее в общих чертах было рассказано о логическом индексировании.
% Логическое индексирование - это выделение той части вектора, которая удовлетворяет заданному условию. Для начала следует получить логический вектор, который в свою очередь подается как индекс. Принцип работы показан на схемах ниже.
% Индексирование с использованием функции find:
%

X1 = M1(2,:)
F1 = find(X1>5)
X1(F1)

% Логический вектор можно задавать напрямую:
%

L4 = [true, false, true, true, false, false];
X1(L4)

% В качестве адресов можно использовать результат сравнения напрямую:
%

X1(X1>5)