INNER_PRODUCT
Описание
Вычисляет скалярное произведение двух плотных векторов, представленных массивами, или двух разреженных векторов, представленных отображениями. Для разреженных векторов каждый ключ отображения обозначает измерение, а соответствующее значение — координату. В вычислении результата участвуют только измерения, присутствующие в обоих отображениях.
Синтаксис
INNER_PRODUCT(<array1>, <array2>)
INNER_PRODUCT(<map1>, <map2>)
Параметры
| Параметр | Описание |
|---|---|
<array1> | Первый плотный вектор. Поддерживаемые типы элементов: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT и DOUBLE. Количество элементов должно совпадать с количеством элементов в <array2>. |
<array2> | Второй плотный вектор. Поддерживаемые типы элементов: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT и DOUBLE. Количество элементов должно совпадать с количеством элементов в <array1>. |
<map1> | Первый разреженный вектор. Он должен иметь тип MAP<K, FLOAT>, где K — целочисленный тип (TINYINT, SMALLINT, INT, BIGINT или LARGEINT) либо строковый тип (CHAR, VARCHAR или STRING). Тип ключей должен относиться к тому же семейству типов, что и тип ключей <map2>. |
<map2> | Второй разреженный вектор. Для него действуют те же ограничения типов, что и для <map1>. Количество записей в двух отображениях может различаться. |
Возвращаемое значение
Возвращает скалярное произведение в виде значения типа FLOAT.
Для входных массивов соответствующие элементы перемножаются, а полученные произведения суммируются. Если любой из массивов имеет значение NULL, содержит элемент NULL или массивы имеют разную длину, функция возвращает ошибку.
Для входных отображений значения с одинаковыми ключами перемножаются, а полученные произведения суммируются. Ключ, присутствующий только в одном отображении, не влияет на результат, что равносильно тому, что отсутствующая координата считается равной нулю. Ключи NULL сопоставляются с другими ключами NULL. Если ключ встречается несколько раз, используется его последнее значение. Если любое из отображений имеет значение NULL или значение, оставшееся для какого-либо ключа, равно NULL, функция возвращает ошибку.
Пример
SELECT INNER_PRODUCT([1, 2], [2, 3]),INNER_PRODUCT([3, 6], [4, 7]);
+-------------------------------+-------------------------------+
| inner_product([1, 2], [2, 3]) | inner_product([3, 6], [4, 7]) |
+-------------------------------+-------------------------------+
| 8 | 54 |
+-------------------------------+-------------------------------+
В следующем примере вычисляется скалярное произведение двух разреженных векторов. Только ключи a и b присутствуют в обоих отображениях, поэтому результат равен 2 * 5 + 3 * 4 = 22:
SELECT INNER_PRODUCT(
MAP('a', CAST(2 AS FLOAT), 'b', CAST(3 AS FLOAT)),
MAP('b', CAST(4 AS FLOAT), 'c', CAST(100 AS FLOAT), 'a', CAST(5 AS FLOAT))
) AS result;
+--------+
| result |
+--------+
| 22 |
+--------+
Если входной массив имеет значение NULL, функция возвращает ошибку:
SELECT INNER_PRODUCT(NULL, [1, 2]);
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]First argument for function inner_product cannot be null
Если входной массив содержит элемент NULL, функция возвращает ошибку:
SELECT INNER_PRODUCT([1, NULL], [1, 2]);
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]First argument for function inner_product cannot have null
Если значение в отображении равно NULL, функция возвращает ошибку:
SELECT INNER_PRODUCT(
MAP(1, CAST(NULL AS FLOAT)),
MAP(1, CAST(2 AS FLOAT))
);
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]First argument for function inner_product cannot have null