ищет расположение вектора (отмеченный символом групповой подстановки) в матрице или гиперматрице
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, того же самого типа.
Если haystack является разрежённой, то needle
может быть неразрежённой. К тому же, если haystack является
логической и используется joker, то needle
должна быть числовой, а не логической. В этом случае любой её ненулевой элемент
считается равным %T.
![]() |
|
Направление внутри массива haystack вдоль которого идёт поиск
вектора needle. Возможными значениями являются "r"
или 1 (вдоль строк), "c" или 2
(вдоль столбцов) или для гиперматрицы любое целое значение, такое, что
2 < dimAlong <= ndims(haystack), представляющее индекс сканируемого измерения. По умолчанию используется "r".
![]() | dimAlong обязателен, когда определён joker
или indType. |
Одиночный элемент типа данных needle. Элементы needle,
равные значению joker игнорируются (сопоставляются/принимаются любые
значения из haystack).
Когда haystack является логическим, то joker
должно быть ненулевым числом.
Чтобы пропустить joker, укажите
..dimAlong, ,indType без значения joker.
Одиночное нечувствительное к регистру слово внутри кавычек ""
(по умолчанию без текста), "headIJK" и "headN":
Определяет формат или индексы. Смотрите ниже описание переменной 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 является матрицей с типом данных, как у
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.В матрице чисел:
Логическая матрица:
В маленьком 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] | ![]() | ![]() |
| Version | Description |
| 6.1 |
|