nzMatrix usando a interface SQL
Este exemplo demonstra o uso do nzMatrix chamando procedimentos armazenados NZPLSQL. Ele ilustra uma ampla variedade de recursos nzMatrix, desde a simples adição de matrizes até operações complexas de álgebra linear, como a Decomposição de Valor Singular (SVD). O exemplo não tem a intenção de resolver um problema específico, mas sim de ilustrar a sintaxe e o uso. Consulte o Matrix Engine Reference Guide para obter exemplos adicionais e informações detalhadas sobre cada procedimento armazenado.
Observação: nzMatrix não substitui as matrizes existentes. Portanto, talvez seja necessário excluir as matrizes pré-existentes antes de executar este exemplo e novamente após a conclusão do exemplo. O procedimento DELETE_ALL_MATRICES() exclui todas as matrizes do banco de dados atual e deve ser usado somente se você tiver certeza de que o banco de dados não contém matrizes necessárias para outros usuários. Se o banco de dados contiver matrizes pertencentes a outro usuário, use o procedimento Delete_MATRIX() para excluir as matrizes por nome.
nzMatrix Executar a partir do Netezza SQL
Esse exemplo pode ser executado a partir da linha de comando nzsql ou de qualquer outro aplicativo baseado em SQL.
--Note: All procedures return a value of true, except where noted.
--Initialize nzMatrix
CALL NZM..INITIALIZE();
--Uncomment the next line to delete all matrices in the current database
--CALL NZM..DELETE_ALL_MATRICES();
--Generate matrices
CALL NZM..UNIFORM('A', 5, 5); --Uniformly distributed random numbers
CALL NZM..NORMAL('B', 5, 5); --Normally distributed random numbers
CALL NZM..CREATE_RANDOM_MATRIX('A53', 5, 3); --Same as UNIFORM
CALL NZM..CREATE_IDENTITY_MATRIX('A_IDENT', 5); --Identity matrix
CALL NZM..CREATE_ONES_MATRIX('A_ONES', 5, 5); --Matrix of ones
--Set and Get the value of a matrix element
CALL NZM..SET_VALUE('A', 3, 2, 0.12345);
CALL NZM..GET_VALUE('A', 3, 2); --Returns 0.12345
--Bulk export of matrix data to a Netezza table
DROP TABLE MYTABLE; --In case MYTABLE already exists
CALL NZM..CREATE_TABLE_FROM_MATRIX('A53', 'MYTABLE');
SELECT * FROM MYTABLE ORDER BY ROW, COL; --Confirm contents of MYTABLE
--Create a matrix from a table -bulk import of data
CALL NZM..CREATE_MATRIX_FROM_TABLE('MYTABLE', 'B53', 5, 3);
--Confirm that B53 has been correctly created
CALL NZM.._TEST_DENSE_VALID('B53'); --Returns true
CALL NZM..LIST_MATRICES(); --Returns current list of matrices
CALL NZM..GET_NUM_ROWS('B53'); --Returns 5
CALL NZM..GET_NUM_COLS('B53'); --Returns 3
--Element-by-element add, subtract, multiply, divide
CALL NZM..ADD('A', 'B', 'A_PLUS_B');
CALL NZM..SUBTRACT('A', 'B', 'A_MINUS_B');
CALL NZM..MULTIPLY_ELEMENTS('A', 'B', 'A_TIMES_ELEM_B');
CALL NZM..DIVIDE_ELEMENTS('A', 'B', 'A_DIV_ELEM_B');
--Element-by-element comparisons
CALL NZM..EQ('A', 'B', 'A_EQ_B'); --Equal
CALL NZM..NE('A', 'B', 'A_NE_B'); --Not equal
CALL NZM..GT('A', 'B', 'A_GT_B'); --Greater than
CALL NZM..GE('A', 'B', 'A_GE_B'); --Greater than or equal
CALL NZM..LT('A', 'B', 'A_LT_B'); --Less than
CALL NZM..LE('A', 'B', 'A_LE_B'); --Less than or equal
CALL NZM..MAX('A', 'B', 'MAX_A_B'); --Pair-wise maximum
CALL NZM..MIN('A', 'B', 'MIN_A_B'); --Pair-wise minimum-
-Functions of matrix elements
CALL NZM..ABS_ELEMENTS('A','A_ABS'); --Absolute value
CALL NZM..CEIL_ELEMENTS('A','A_CEIL'); --Ceiling
CALL NZM..FLOOR_ELEMENTS('A','A_FLOOR');--Floor
CALL NZM..EXP_ELEMENTS('A','A_EXP'); --Exponential
CALL NZM..LN_ELEMENTS('A','A_LN'); --Natural logarithm
CALL NZM..LOG_ELEMENTS('A','A_LOG'); --Base 10 logarithm
CALL NZM..INT_ELEMENTS('A','A_INT'); --Truncate toward zero
--Round to the specified number of decimal digits
CALL NZM..ROUND_ELEMENTS('A', 'A_ROUND', 2);
--Show the contents of a matrix
CALL NZM..PRINT('A_ROUND', FALSE); --Returns the contents of A_ROUND
--Modulo (remainder) function
CALL NZM..MOD_ELEMENTS('A', 'A_MOD', 3);
--ReductionsCALL NZM..RED_MAX('A'); --Returns the maximum value in A
CALL NZM..RED_MIN('A'); --Returns the minimum value in A
CALL NZM..RED_MAX_ABS('A'); --Returns the maximum absolute value in A
CALL NZM..RED_MIN_ABS('A'); --Returns the minimum absolute value in A
CALL NZM..RED_SUM('A'); --Returns the sum of the values in A
CALL NZM..RED_SSQ('A'); --Returns the sum of the squares of the values in A
CALL NZM..RED_TRACE('A'); --Returns the trace of A (the sum of the diagonal elements)
CALL NZM..ANY_NONZERO('A'); --Returns one if any of A's values are nonzero. Otherwise, returns zero.
CALL NZM..ALL_NONZERO('A'); --Returns one if all of A's values are nonzero. Otherwise, returns zero.
--Copy a submatrix
CALL NZM..COPY_SUBMATRIX('A', 'A_SUB', 2, 3, 1, 4);
CALL NZM..GET_NUM_ROWS('A_SUB'); --Returns 2
CALL NZM..GET_NUM_COLS('A_SUB'); --Returns 4
--Transpose (interchange rows and columns)
CALL NZM..TRANSPOSE('A', 'A_TRANS');
--Concatenate vertically (number of columns stays the same)
CALL NZM..CONCAT('A', 'B', 'A_B_CONCAT_V', 'V');
CALL NZM..GET_NUM_ROWS('A_B_CONCAT_V'); --Returns 10
CALL NZM..GET_NUM_COLS('A_B_CONCAT_V'); --Returns 5
--Concatenate horizontally (number of rows stays the same)
CALL NZM..CONCAT('A', 'B', 'A_B_CONCAT_H', 'H');
CALL NZM..GET_NUM_ROWS('A_B_CONCAT_H'); --Returns 5
CALL NZM..GET_NUM_COLS('A_B_CONCAT_H'); --Returns 10
--Kronecker product
CALL NZM..KRONECKER('A', 'B', 'A_B_KRON');
CALL NZM..GET_NUM_ROWS('A_B_KRON'); --Returns 25
CALL NZM..GET_NUM_COLS('A_B_KRON'); --Returns 25
--Housekeeping
CALL NZM..MATRIX_EXISTS('A');
CALL NZM..DELETE_MATRIX('A');
CALL NZM..MATRIX_EXISTS('A'); --Returns false
--Linear algebra
CALL NZM..CREATE_RANDOM_MATRIX('A', 1000, 1000);
--Matrix inversion
CALL NZM..INVERSE('A', 'A_INV');
--Matrix multiplication
CALL NZM..GEMM('A', 'A_INV', 'A_A_INV');
--Verify that A_INV is the inverse of A, within floating point precision
CALL NZM..CREATE_IDENTITY_MATRIX('I', 1000);
CALL NZM..SUBTRACT('A_A_INV', 'I', 'A_A_INV_MINUS_I');
CALL NZM..RED_MAX_ABS('A_A_INV_MINUS_I'); --Returns a value close to zero
--Linear Equation Solving
--Solve A X = RHS for X
CALL NZM..NORMAL('RHS', 1000, 10);
CALL NZM..SOLVE('A', 'RHS', 'X');
--Verify that A X = RHS, within floating point precision
CALL NZM..GEMM('A', 'X', 'A_X');
CALL NZM..SUBTRACT('A_X', 'RHS', 'A_X_MINUS_RHS');
CALL NZM..RED_MAX_ABS('A_X_MINUS_RHS'); --Returns a value close to zero
--Linear Least Squares
--For over/underdetermined systems A X_LLS = RHS,
--find linear least squares solution X_LLS
CALL NZM..SOLVE_LINEAR_LEAST_SQUARES('A', 'RHS', 'X_LLS');
--Singular Value Decomposition
CALL NZM..SVD('A', 'U', 'S', 'VT');
--Create a diagonal matrix from the one-column matrix S
CALL NZM..VEC_TO_DIAG('S', 'SIGMA');
--Verify that A = U SIGMA VT, within floating point precision
CALL NZM..GEMM('U', 'SIGMA', 'U_SIGMA');
CALL NZM..GEMM('U_SIGMA', 'VT', 'U_SIGMA_VT');
CALL NZM..SUBTRACT('A', 'U_SIGMA_VT', 'A_MINUS_U_SIGMA_VT');
CALL NZM..RED_MAX_ABS('A_MINUS_U_SIGMA_VT'); --Returns a value close to zero
--Eigenvalues and eigenvectors of a symmetric matrix
--Create a symmetric matrix
CALL NZM..TRANSPOSE('A', 'A_TRANSP');
CALL NZM..ADD('A', 'A_TRANSP', 'A_SYMM');
--Compute Eigenvalues W and Eigenvectors Z
CALL NZM..EIGEN('A_SYMM', 'W', 'Z');
Nota:
Na operação real, o comando CALL NZM..._TEST_DENSE_VALID(); usado no exemplo emite mensagens de aviso que fornecem algum texto informativo sobre os testes que está realizando. A chamada retorna TRUE ou FALSE, dependendo se a matriz passa em todos os testes de validade. O texto do aviso foi omitido do exemplo para maior clareza.