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