Matlab Code for Spike Time Distances Between Spike Trains

Daniel Reich: dsreich@gmail.com


main cost-based metrics page
algorithm page for cost-based metrics

Matlab code for Spike Time Metric

function d=spkd(tli,tlj,cost) % % d=spkd(tli,tlj,cost) calculates the "spike time" distance % (Victor & Purpura 1996) for a single cost % % tli: vector of spike times for first spike train % tlj: vector of spike times for second spike train % cost: cost per unit time to move a spike % % Copyright (c) 1999, 2024, by Daniel Reich and Jonathan Victor, all rights reserved. % % This code is released under a BSD license. % Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: % * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. % * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer % in the documentation and/or other materials provided with the distribution. % * Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this % software without specific prior written permission. % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, % BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT % SHALL HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT % LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER % CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) % ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. % % Translated to Matlab by Daniel Reich from FORTRAN code by Jonathan Victor. % nspi=length(tli); nspj=length(tlj); if cost==0 d=abs(nspi-nspj); return elseif cost==Inf d=nspi+nspj; return end scr=zeros(nspi+1,nspj+1); % % INITIALIZE MARGINS WITH COST OF ADDING A SPIKE % scr(:,1)=(0:nspi)'; scr(1,:)=(0:nspj); if nspi & nspj for i=2:nspi+1 for j=2:nspj+1 scr(i,j)=min([scr(i-1,j)+1 scr(i,j-1)+1 scr(i-1,j-1)+cost*abs(tli(i-1)-tlj(j-1))]); end end end d=scr(nspi+1,nspj+1);