Перейти к содержимому
Последнее обновление

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