/* * File : lib.c * * Andrew H. Fagg * 5/10/91 * * Useful library routines for work in NSL. * Includes : * Matrix, Vector manipulation. * Random weight generators. * Distributed representation manipulation (creation, interpretation, * addition with, etc.) * * */ #include "nsl_include.h" #include "alib.h" #define nl << "\n" #define sp << " " /* * nsl_matrix vec_mult_vec_trans(nsl_vector& vecA, nsl_vector& vecB) * * T * Return = A * B * */ nsl_matrix vec_mult_vec_trans(NslFloat1& vecA, NslFloat1& vecB) { int An, Bn; int i, j; An = vecA.get_xn(); Bn = vecB.get_xn(); nsl_matrix out(Bn, An); for(i = 0; i < An; ++i) for(j = 0; j < Bn; ++j) out[j][i] = vecA[i] * vecB[j]; return out; } nsl_matrix vec_mult_vec_trans(NslFloat1& vecA, NslInt1& vecB) { int An, Bn; int i, j; An = vecA.get_xn(); Bn = vecB.get_xn(); nsl_matrix out(Bn, An); for(i = 0; i < An; ++i) for(j = 0; j < Bn; ++j) out[j][i] = vecA[i] * vecB[j]; return out; } /* * nsl_vector mat_mult_col_vec(nsl_matrix& mat, nsl_vector& vec) * * Computes C = M * V * * Where C and V are both column vectors and M is a matrix. * */ nsl_vector mat_mult_col_vec(NslFloat2& mat, NslFloat1& vec) { int xn; int yn; int vxn; int i, j; xn = mat.get_xn(); yn = mat.get_yn(); vxn = vec.get_xn(); if(xn != vxn) { cout << "mat_mult_col_vec : dimension mismatch.\n"; cout << xn sp << yn sp << vxn nl; exit(0); } nsl_vector out(yn); for(i = 0; i < yn; ++i) { out.elem(i) = 0.0; for(j = 0; j < xn; ++j) out.elem(i) += vec.elem(j) * mat.elem(j,i); } return out; } nsl_vector mat_mult_col_vec(NslFloat2& mat, NslInt1& vec) { int xn; int yn; int vxn; int i, j; xn = mat.get_xn(); yn = mat.get_yn(); vxn = vec.get_xn(); if(xn != vxn) { cout << "mat_mult_col_vec : dimension mismatch.\n"; cout << xn sp << yn sp << vxn nl; exit(0); } nsl_vector out(yn); for(i = 0; i < yn; ++i) { out.elem(i) = 0.0; for(j = 0; j < xn; ++j) out.elem(i) += vec.elem(j) * mat.elem(j,i); } return out; } /* * nsl_vector mat_trans_mult_col_vec(nsl_matrix& mat, nsl_vector& vec) * * T * Computes C = M * V * * Where C and V are column vectors. * */ nsl_vector mat_trans_mult_col_vec(NslFloat2& mat, NslInt1& vec) { int xn; int yn; int vxn; int i, j; xn = mat.get_xn(); yn = mat.get_yn(); vxn = vec.get_xn(); if(yn != vxn) { cout << "mat_mult_col_vec : dimension mismatch.\n"; cout << xn sp << yn sp << vxn nl; exit(0); } nsl_vector out(xn); for(i = 0; i < xn; ++i) { out.elem(i) = 0.0; for(j = 0; j < yn; ++j) out.elem(i) += vec.elem(j) * mat.elem(i,j); } return out; } /* * void extract_vector(nsl_matrix& mat, int col, nsl_vector& vec) * * Copy the