vectorfind
ищет расположение вектора (отмеченный символом групповой подстановки) в матрице или гиперматрице
Синтаксис
ind = vectorfind(haystack, needle) ind = vectorfind(haystack, needle, dimAlong) ind = vectorfind(haystack, needle, dimAlong, ,indType) [ind, matching] = vectorfind(haystack, needle, dimAlong, joker) [ind, matching] = vectorfind(haystack, needle, dimAlong, joker, indType)
Аргументы
- haystack
Матрица или гиперматрица любого типа, возможно разрежённая: массив в котором будет идти поиск вектора.
- needle
Вектор, который надо искать в
haystack
, того же самого типа. Еслиhaystack
является разрежённой, тоneedle
может быть неразрежённой. К тому же, еслиhaystack
является логической и используетсяjoker
, тоneedle
должна быть числовой, а не логической. В этом случае любой её ненулевой элемент считается равным%T
.- Десятичные числа, комплексные числа и кодированные целые числа считаются одним типом: числовым.
- Значения
%nan
принимаются вneedle
. Они обрабатываются обычным способом, как и другие значения. Они совпадают только с%nan
вhaystack
.
- dimAlong
Направление внутри массива
haystack
вдоль которого идёт поиск вектораneedle
. Возможными значениями являются"r"
или1
(вдоль строк),"c"
или2
(вдоль столбцов) или для гиперматрицы любое целое значение, такое, что2 < dimAlong <= ndims(haystack)
, представляющее индекс сканируемого измерения. По умолчанию используется"r"
.dimAlong
обязателен, когда определёнjoker
илиindType
.- joker
Одиночный элемент типа данных
needle
. Элементыneedle
, равные значениюjoker
игнорируются (сопоставляются/принимаются любые значения изhaystack
).Когда
haystack
является логическим, тоjoker
должно быть ненулевым числом.Чтобы пропустить
joker
, укажите..dimAlong, ,indType
без значенияjoker
.- indType
Одиночное нечувствительное к регистру слово внутри кавычек
""
(по умолчанию без текста),"headIJK"
и"headN"
: Определяет формат или индексы. Смотрите ниже описание переменнойind
.- ind
Если
needle
по размеру больше, чемhaystack
, в выбранной размерностиdimAlong
, и возвращаетсяind=[]
.Если длина
needle
соответствует по размеруhaystack
по выбранной размерности:По умолчанию (
indType==""
):ind
является вектором-строкой, содержащей индексы совпавших строк и столбцовhaystack
. В случае гиперматрицы возвращаемые индексы совпавших диапазонов линеаризованы через все размерности кроме однойdimAlong
(см. примеры).indType="headN":
ind
является вектором-строкой линейных индексов вhaystack
первых элементов совпавших строк, столбцов и более высоких диапазонов.indType="headIJK":
ind
является матрицей: каждая строка возвращает индексы[i j ..]
вhaystack
первых элементов совпавших диапазонов (строки, столбцы или более высокие диапазоны).ind
имеет столько строк, сколько совпавших диапазонов вhaystack
.
В противном случае (короткая
needle
): По умолчанию,ind
является вектором-строкой линейных индексов элементовhaystack
, где начинаются совпавшие диапазоны. Используя опциюindType="headN"
ни к чему не приводит. ИспользованиеindType="headIJK"
возвращаетind
в виде матрицы индексов[i j k ..]
, как было описано выше.
Возвращаемые индексы сортированы в порядке возрастания.- matching
Когда используется
matching
выходная необязательная переменнаяmatching
является матрицей с типом данных, как уhaystack
, возвращающей фактические диапазоны совпадения: диапазон совпадения №i возвращается в строкеmatching(i,:)
.Когдаhaystack
является разрежённой, то матрицаmatching
тоже является разрежённой.
Описание
vectorfind()
ищет указанную последовательность значений
needle
(иголка) в массиве haystack
(стог сена) по указанному
прямому направлению/измерению: ширина (строки), высота (столбцы), толщина (подобно пикселям RGB) и т.д.
Иголка needle
может быть длиннее или короче, чем размер исследуемой стороны стога
сена haystack
.
Может быть определено специальное значение, так называемый джокер.
Тогда это значение работает, как символ универсальной подстановки там, где он встречается в векторе иглы
needle
. Поскольку это значение более нельзя выбирать, то -- ЛЮБОЕ значение после
совпадений в стогу сена haystack
на своей позиции --, оно не может одновременно
использоваться в игле needle
в качестве выбираемого. На практике любое значение,
не представленное в стоге сена haystack
, обязательно требует хорошего джокера. Однако,
это условие не является обязательным.
Следовательно: когда стог сена haystack
является логическим, то джокер -- а также
вектор иглы needle
-- должен быть числовым. Действительно, в противном случае было
бы невозможно выбрать значение джокера из ограниченного множества значений {%T, %F}
.
Когда такой символ универсальной подстановки используется, то фактические значения в совпавших
диапазонах не фиксируются. Тогда можно получить их благодаря необязательной выходной переменной
matching
. В противном случае matching
будет пустой (это
тривиальный повтор вектора иглы needle
).
Поиск в гиперматрицах
Использование vectorfind()
с гиперматрицей в качестве haystack
заслуживает несколько особого внимания:
О значении направления
dimAlong
:Например, мы можем затем исследовать массив
haystack
по "толщине", то есть сквозь её следующие друг за другом слоиhaystack(:,:,#,..)
. Чтобы так сделать, мы определим здесьdimAlong = 3
.Как и для матриц, этот вид многомерного массива может быть просканирован вдоль его строк или столбцов. Подходящие значения
dimAlong
имеют некоторые исключения:- Поиск иглы как строки сканирует массив
сквозь его столбцы. Следовательно,
значение
dimAlong = "r"
должно быть эквивалентно значениюdimAlong = 2
вместо 1! - Аналогично поиск иглы как столбцы сканирует массив
сквозь его строки: Обычное значение
dimAlong = "c"
должно быть эквивалентно значениюdimAlong = 1
вместо 2!
Для того, чтобы не нарушать общую договорённость, о том что
"r"<=>1
и"c"<=>2
используется везде в Scilab,vectorfind()
придерживается и справляется с ним. Но нужно иметь в виду лежащий в основе переключатель, чтобы иметь чёткое понимание возвращаемых по умолчанию индексов, когда используются"r",1
или"c",2
.- Поиск иглы как строки сканирует массив
сквозь его столбцы. Следовательно,
значение
О возвращаемых индексах совпадающих строк, столбцов, "пикселей"... когда игла
needle
такой же длины, как размер стороны стога сенаhaystack
и опцияindType
не используется:Индексы совпадающих диапазонов являются линейными индексами компонентов следующих подпространств:
- С
dimAlong = "r" = 1
: вhaystack(:,1,:,:..)
- С
dimAlong = "c" = 2
: вhaystack(1,:,:,:..)
- С
dimAlong = 3
: вhaystack(:,:,1,:..)
- С
dimAlong = 4
: вhaystack(:,:,:,1,:..)
. - и др...
haystack
, чтобы фактически обращаться к совпадающим диапазонам в ND-мерном массиве с N>2. Необязательный параметрindType = "headN" | "headIJK
затем вернёт более удобные в работе индексы, обращающиеся ко всему массивуhaystack
.- С
Примеры
В матрице чисел:
m = [ 1 0 1 2 2 1 2 2 0 1 0 2 0 2 %nan 2 1 2 2 %nan 1 0 1 2 ]; vectorfind(m,[2 0 1 1], "c") // => 5 vectorfind(m,[2 0 1 1], "c",,"headN") // => 17 vectorfind(m,[2 0 1 1], "c",,"headIJK") // [1 5] // С короткой иглой: vectorfind(m,[2 2]) // => [2 13] vectorfind(m,[2 2], "r",,"headN") // тот же выходной параметр vectorfind(m,[2 2], "r",,"headIJK") // => [2 1 ; 1 4] vectorfind(m,[2 %nan]) // => [4 7] // С символом универсальной подстановки в игле: // пример №1: все столбцы начинаются с 1 и заканчиваются 2: [n, ma] = vectorfind(m,[1 .3 .3 2], "c", .3) // => n = [1 6], ma = [1 2 0 2; 1 2 2 2] // пример №2: все строки, имеющие диапазон [2 * 2] (короткая игла с символом универсальной подстановки): [n, ma] = vectorfind(m,[2 .3 2], "r", .3) // => n = [7 15], ma = [2 %nan 2; 2 1 2] vectorfind(m,[2 .3 2], "r", .3, "headIJK") // => [3 2 ; 3 4] // Примечание: значение %nan соответствует *
Логическая матрица:
m = [0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1]==1 // m = // F F F T T F // F T T T F T // T T F T T T // T F T F F T vectorfind(m, [%F %T %T %F], "c") // => 2 vectorfind(m, [%T %T], "c") // => [3 6 13 14 22 23] vectorfind(m, [1 1], "c") // => ошибка: ожидался тот же тип // джокер => игла является числовой: [n, ma] = vectorfind(m, [0 %nan 0 %nan 1], "r", %nan) // => n=[1 8], ma=[F F F T T ; F T F F T]
В маленьком 8-цветном RGB-изображении (трёхмерная гиперматрица целых чисел типа uint8):
// Формирование массива яркости цвета: m = [1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0]; m = uint8(matrix(m,3,5,3)*255) // m = //(:,:,1) // Красный слой // 255 255 255 255 255 // 255 255 0 0 0 // 255 255 0 255 0 //(:,:,2) // Зелёный слой // 0 255 0 0 0 // 0 255 0 255 0 // 255 255 0 0 255 //(:,:,3) // Синий слой // 255 0 255 0 0 // 255 255 255 255 255 // 255 0 0 255 0 // Определяет позицию красных пикселей: vectorfind(m, [255 0 0], 3) // => [10 13] vectorfind(m, [255 0 0], 3,,"headIJK") // => [1 4 1 ; 1 5 1] // Пиксели с включённым зелёным и синим цветом, каким бы ни был их красный канал: // Мы можем использовать десятично-кодированную иглу (не uint8). // Тогда, %nan можно использовать в качестве джокера, который не может быт в изображении с типом uint8: vectorfind(m, [%nan 255 255], 3, %nan,"headIJK") // => [3 1 1; 2 2 1; 2 4 1] // Столбцы из 255: vectorfind(m, [255 255 255], "c") // => [1 2 7 11]
В четырёхмерной текстовой гиперматрице:
m = [ "U" "C" "G" "A" "A" "A" "U" "U" "A" "G" "A" "G" "A" "A" "A" "A" "C" "C" "U" "U" "C" "G" "G" "G" "A" "G" "A" "C" "G" "C" "C" "C" "G" "C" "A" "G" "C" "U" "G" "G" "G" "A" "A" "G" "C" "C" "C" "C" "C" "G" "G" "A" "A" "G" "U" "C" "A" "U" "G" "C" ]; m = matrix(m, 3, 5, 2, 2); // (:,:,1,1) // !U C A G A ! // !A C G G G ! // !A C U A G ! //(:,:,2,1) // !A G C A C ! // !A A G A A ! // !C A G C G ! //(:,:,1,2) // !U A U C G ! // !U U C A C ! // !C U G C A ! //(:,:,2,2) // !G C G G G ! // !G U A G C ! // !C A C G C ! vectorfind(m, ["A" "A" "C"], "c") // => [6 9] vectorfind(m, ["" "G" "G"], "c", "") // => [5 8 19] // Джокер [n, ma] = vectorfind(m, ["" "G" "G"], "c", "", "headN") // => n=[13 22 55], ma=[A G G; C G G; G G G] vectorfind(m, ["" "C" "C"], "c", "", "headIJK") // => [1 2 1 1 ; 1 5 2 2] // Короткая игла vectorfind(m, ["C" "C"], "c",,"headIJK") // => [1 2 1 1; 2 2 1 1; 2 5 2 2] // Короткая игла с джокером vectorfind(m, ["A" "" "A"],"r","","headIJK") // => [1 3 1 1 ; 2 2 2 1]
Смотрите также
История
Версия | Описание |
6.1 |
|
Report an issue | ||
<< members | Поиск и сортировка | Операции с множествами >> |