NAME

PDL::CCS::MatrixOps - Low-level matrix operations for compressed storage sparse PDLs

SYNOPSIS

use PDL;
use PDL::CCS::MatrixOps;

##---------------------------------------------------------------------
## ... stuff happens

ccs_vcos_zdd

Signature: (
  indx ixa(2,NnzA); nza(NnzA);
  b(N);
  float+ [o]vcos(M);
  float+ [t]anorm(M);
  PDL_Indx sizeM=>M;
)

Computes the vector cosine similarity of a dense row-vector $b(N) with respect to each column $a(i,*) of a sparse index-encoded PDL $a() of logical dimensions (M,N), with output to a dense piddle $vcos(M). "Missing" values in $a() are treated as zero, and magnitudes for $a() are passed in the optional parameter $anorm(), which will be implicitly computed using ccs_vnorm if the $anorm() parameter is omitted or empty. This is basically the same thing as:

$anorm //= ($a**2)->xchg(0,1)->sumover->sqrt;
$vcos    = ($a * $b->slice("*1,"))->xchg(0,1)->sumover / ($anorm * ($b**2)->sumover->sqrt);

... but should be must faster to compute.

Output values in $vcos() are cosine similarities in the range [-1,1], except for zero-magnitude vectors which will result in NaN values in $vcos(). If you need non-negative distances, follow this up with a:

$vcos->minus(1,$vcos,1)
$vcos->inplace->setnantobad->inplace->setbadtoval(0); ##-- minimum distance for NaN values

to get distances values in the range [0,2]. You can use PDL threading to batch-compute distances for multiple $b() vectors simultaneously:

$bx   = random($N, $NB);                   ##-- get $NB random vectors of size $N
$vcos = ccs_vcos_zdd($ixa,$nza, $bx, $M);  ##-- $vcos is now ($M,$NB)

ccs_vcos_zdd() always clears the bad status flag on the output piddle $vcos.

ACKNOWLEDGEMENTS

Perl by Larry Wall.

PDL by Karl Glazebrook, Tuomas J. Lukka, Christian Soeller, and others.

KNOWN BUGS

We should really implement matrix multiplication in terms of inner product, and have a good sparse-matrix only implementation of the former.

AUTHOR

Bryan Jurish <moocow@cpan.org>

All other parts Copyright (C) 2009-2024, Bryan Jurish. All rights reserved.

This package is free software, and entirely without warranty. You may redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

perl(1), PDL(3perl)