Please note that the recommended version of Scilab is 2026.0.0. This page might be outdated.
See the recommended documentation of this function
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 | Поиск и сортировка | Операции с множествами >> |