VECTOR_ MUL
On this page
The VECTOR_ function multiples two vectors element by element and returns a vector which is the result of that multiplication.
Syntax
VECTOR_MUL(vector_expression, vector_expression)
Arguments
-
vector_: An expression that evaluates to a vector.expression Vectors can be stored in SingleStore using the native VECTORtype (Vector Type) or theBLOBtype (Binary String Types).SingleStore recommends using the VECTORtype when possible. -
JSON strings are allowed as
vector_s when the other argument is of typeexpression VECTOR.
Return Type
If one of the two arguments is of type VECTOR, the function will return a VECTOR of the same type as that argument.
If both arguments are BLOBs, then the return type will be by default a BLOB that contains a vector encoded as 32-bit floating point numbers (F32).BLOB that contains a vector encoded using the type of the suffix.
See Using Suffixes for Other Element Types with BLOBs for more information on using suffixes with vectors encoded as BLOBs.
Remarks
-
If both arguments are of type
VECTOR, those arguments must have the same element types and the same number of elements. -
If one argument is a
VECTOR, the other argument (which may be a JSON string or aBLOB) will be converted to the type of theVECTORargument.-
It will cause an error if the JSON string has a different number of elements than the
VECTORargument. -
It will cause an error if the length of the
BLOBis such that theBLOBcannot be converted to the type of theVECTOR.Note that there is no type checking in this conversion, so ensure that the BLOBs were encoded with the same type as theVECTORargument.
-
-
If both arguments are
BLOBs, both arguments will be treated as vectors with 32-bit floating-point numbers.It will cause an error if the arguments are different lengths.
-
The default format for vector element storage and processing is a 32-bit floating-point number (
F32).When the inputs are BLOBs, the function assumes the inputs are vectors encoded as 32-bit floating-point numbers. -
When a suffix is used, the function will interpret the inputs as vectors encoded as specified by the suffix.
See Using Suffixes for Other Element Types with BLOBs for more information.
Output Format for Examples
Vectors can be output in JSON or binary format.
Use the following command to output vectors in JSON format.
SET vector_type_project_format = JSON;
Use the following command to set the output format back to binary.
SET vector_type_project_format = BINARY;
Using VECTOR_ MUL with the VECTOR Data Type
The examples below show three different uses of VECTOR_ with varying types of arguments.
Example 1 - Vector Type
The example below multiplies two vectors stored as VECTORs.
First create a table of vectors of length 4 using the VECTOR data type and insert data into that table.
CREATE TABLE vectors (id int, vec VECTOR(4) not null);INSERT INTO vectors VALUES (1, '[0.45, 0.55, 0.495, 0.5]');INSERT INTO vectors VALUES (2, '[0.1, 0.8, 0.2, 0.555]');INSERT INTO vectors VALUES (3, '[-0.5, -0.03, -0.1, 0.86]');INSERT INTO vectors VALUES (4, '[0.5, 0.3, 0.807, 0.1]');
Note
The default element type for Vector Type is 32-bit floating point (F32).
The following SQL multiplies each of those vectors by the vector '[0..
SET vector_type_project_format = JSON; /* to make vector output readable */SET @qv = '[0.1,0.1,0.1,0.1]':>VECTOR(4);/* run both SET commands before this query */SELECT id, VECTOR_MUL(vec, @qv)FROM vectorsORDER BY id;
+------+-----------------------------------------------------------+
| id | VECTOR_MUL(vec, @qv) |
+------+-----------------------------------------------------------+
| 1 | [0.0449999981,0.0550000034,0.0494999997,0.0500000007] |
| 2 | [0.0100000007,0.0800000057,0.0200000014,0.0555000007] |
| 3 | [-0.0500000007,-0.00300000003,-0.0100000007,0.0860000029] |
| 4 | [0.0500000007,0.0300000012,0.0807000026,0.0100000007] |
+------+-----------------------------------------------------------+Example 2 - Vector Type and BLOB Type
Inputs to VECTOR_ can also be BLOBs.VECTOR and the other of type BLOB, VECTOR_ will automatically convert the BLOB to the type of the VECTOR argument.
The SQL below shows an example where VECTOR_ is used with a vector that is encoded as a BLOB using JSON_.VECTOR_ will automatically convert this BLOB to the type of, vec, the left-hand argument.
SET vector_type_project_format = JSON; /* to make vector output readable */SET @qv = JSON_ARRAY_PACK('[0.1,0.1,0.1,0.1]');SELECT id, VECTOR_MUL(vec, @qv)FROM vectorsORDER BY id;
+------+-----------------------------------------------------------+
| id | VECTOR_MUL(vec, @qv) |
+------+-----------------------------------------------------------+
| 1 | [0.0449999981,0.0550000034,0.0494999997,0.0500000007] |
| 2 | [0.0100000007,0.0800000057,0.0200000014,0.0555000007] |
| 3 | [-0.0500000007,-0.00300000003,-0.0100000007,0.0860000029] |
| 4 | [0.0500000007,0.0300000012,0.0807000026,0.0100000007] |
+------+-----------------------------------------------------------+The results from Example 1 and Example 2 are the same.VECTOR or a BLOB.
Important
It is important to ensure that the vector encoded as a BLOB has the same element type and length as the vector(s) stored as VECTORs.BLOB encoding and the VECTOR type.
Example 3 - JSON String Argument and I16 Element Type
This example shows how to use VECTOR_ with a VECTOR with an elementType of 16-bit integer (I16) and how to use a JSON string as input to VECTOR_.
First create a table with a VECTOR attribute of length 3 and element type I16 and insert data into that table.
CREATE TABLE vectors_i16(id INT, vec VECTOR(3, I16));INSERT INTO vectors_i16 VALUES(1, '[1, 2, 3]');INSERT INTO vectors_i16 VALUES(2, '[4, 5, 6]');INSERT INTO vectors_i16 VALUES(3, '[1, 4, 8]');
The following example shows the use of VECTOR_ with arguments that are both vectors stored as BLOBs.
The following SQL multiples each of the vectors in the vectors_ table by the vector '[1,2,3]'.
In this example, the JSON string '[1,2,3]' is used as input to the VECTOR_ function.VECTOR_ will detect that the second argument, vec, is of type VECTOR of length 3 and with element type 16-bit integer and will automatically convert the JSON string to a vector of that type.
SET vector_type_project_format = JSON; /* to make vector output readable */SELECT id, vec, VECTOR_MUL(vec, '[1,2,3]')FROM vectors_i16ORDER BY id;
+------+---------+----------------------------+
| id | vec | VECTOR_MUL(vec, '[1,2,3]') |
+------+---------+----------------------------+
| 1 | [1,2,3] | [1,4,9] |
| 2 | [4,5,6] | [4,10,18] |
| 3 | [1,4,8] | [1,8,24] |
+------+---------+----------------------------+Using VECTOR_ MUL with Vectors as Blobs
The following examples and descriptions show the use of VECTOR_ with arguments that are both vectors stored as BLOBs.
Example 1 - BLOB Arguments
Create a table with a column of type BLOB to store the vectors.vec and type BLOB, will store the vectors.BLOBs, hence the column of type BLOB named vec.
Then use the JSON_ built-in function to easily insert properly formatted vectors.
CREATE TABLE vectors_b (id int, vec BLOB not null);INSERT INTO vectors_b VALUES (1, JSON_ARRAY_PACK('[0.1, 0.8, 0.2, 0.555]'));INSERT INTO vectors_b VALUES (2, JSON_ARRAY_PACK('[0.45, 0.55, 0.495, 0.5]'));
The following query multiplies the vectors in the vectors_ table by the vector '[0. and uses JSON_ to see the results in JSON format.
SET @qv = JSON_ARRAY_PACK('[0.1,0.1,0.1,0.1]');SELECT id, JSON_ARRAY_UNPACK(VECTOR_MUL(vec, @qv)) AS vector_mulFROM vectors_bORDER BY id;
+------+-------------------------------------------------------+
| id | vector_mul |
+------+-------------------------------------------------------+
| 1 | [0.0100000007,0.0800000057,0.0200000014,0.0555000007] |
| 2 | [0.0449999981,0.0550000034,0.0494999997,0.0500000007] |
+------+-------------------------------------------------------+JSON_ was used here to output the vectors in readable format because VECTOR_ returns a BLOB when its inputs are BLOBs.
The following query multiplies the vectors in the vectors_ table by the vector '[0. and uses HEX to view the results in hexadecimal format.
SET @qv = JSON_ARRAY_PACK('[0.1,0.1,0.1,0.1]');SELECT id, HEX(VECTOR_MUL(vec, @qv)) AS vector_mulFROM vectors_bORDER BY id;
+------+----------------------------------+
| id | vector_mul |
+------+----------------------------------+
| 1 | 0BD7233C0BD7A33D0BD7A33CF853633D |
| 2 | EB51383DAF47613D83C04A3DCDCC4C3D |
+------+----------------------------------+Using Suffixes for Other Element Types with BLOBs
The default element type for vector storage and processing is 32-bit floating point (F32).
You can specify the datatype of the vector elements to be used in the operation by adding a suffix to the function._.
When using a suffix, the return type will be the type specified by the suffix.
Note
The functions with suffixes do not work with the VECTOR type.
The following table lists the suffixes and their data type.
|
Suffix |
Data Type |
|---|---|
|
|
8-bit signed integer |
|
|
16-bit signed integer |
|
|
32-bit signed integer |
|
|
64-bit signed integer |
|
|
32-bit floating-point number (IEEE standard format) |
|
|
64-bit floating-point number (IEEE standard format) |
Example 2 - BLOBs with 16-bit Integers
Below is an example of using JSON_ and VECTOR_ with 16-bit signed integers.
First create a table of vectors stored as 16-bit integers._ suffix on JSON_.
CREATE TABLE vectors_b_i (id int, vec BLOB not null);INSERT INTO vectors_b_i VALUES (1, JSON_ARRAY_PACK_I16('[1, 3, 2, 5]'));INSERT INTO vectors_b_i VALUES(2, JSON_ARRAY_PACK_I16('[23, 4, 1, 8]'));
The following query multiplies the vectors in the vectors_table by the vector '[2,2,2,2]'.
SET @qv = JSON_ARRAY_PACK_I16('[2, 2, 2, 2]');SELECT JSON_ARRAY_UNPACK_I16(VECTOR_MUL_I16(@qv, vec)) AS vector_mulFROM vectors_b_i;
+-------------+
| vector_mul |
+-------------+
| [2,6,4,10] |
| [46,8,2,16] |
+-------------+The result is an array of 16-bit integers as indicated by the _ suffix.
Note
Be sure that the suffixes you use to pack the vector data match the suffixes you use to unpack the data and the suffixes you use on functions to process that data.
Formatting Binary Vector Data for BLOBs
When using the BLOB type for vector operations, vector data can be formatted using JSON_.BLOBs.BLOB containing packed numbers in little-endian byte order.BLOBs can be of any length; however, the input blob length must be divisible by the size of the packed vector elements .
Related Topics
Last modified: May 30, 2024