Daniel@0: function [T,Z] = mk_stochastic(T) Daniel@0: % MK_STOCHASTIC Ensure the argument is a stochastic matrix, i.e., the sum over the last dimension is 1. Daniel@0: % [T,Z] = mk_stochastic(T) Daniel@0: % Daniel@0: % If T is a vector, it will sum to 1. Daniel@0: % If T is a matrix, each row will sum to 1. Daniel@0: % If T is a 3D array, then sum_k T(i,j,k) = 1 for all i,j. Daniel@0: Daniel@0: % Set zeros to 1 before dividing Daniel@0: % This is valid since S(j) = 0 iff T(i,j) = 0 for all j Daniel@0: Daniel@0: if (ndims(T)==2) & (size(T,1)==1 | size(T,2)==1) % isvector Daniel@0: [T,Z] = normalise(T); Daniel@0: elseif ndims(T)==2 % matrix Daniel@0: Z = sum(T,2); Daniel@0: S = Z + (Z==0); Daniel@0: norm = repmat(S, 1, size(T,2)); Daniel@0: T = T ./ norm; Daniel@0: else % multi-dimensional array Daniel@0: ns = size(T); Daniel@0: T = reshape(T, prod(ns(1:end-1)), ns(end)); Daniel@0: Z = sum(T,2); Daniel@0: S = Z + (Z==0); Daniel@0: norm = repmat(S, 1, ns(end)); Daniel@0: T = T ./ norm; Daniel@0: T = reshape(T, ns); Daniel@0: end