forked from JeremyJiWZ/speech_test
-
Notifications
You must be signed in to change notification settings - Fork 1
/
lsum.m
40 lines (32 loc) · 1.14 KB
/
lsum.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function lz=lsum(X,DIM)
% lz=lsum(X,DIM);
%
% lz=log(x(1)+x(2)+....x(n)) X(i)= log(x(i)) ;
%
% lsum(X) sums along first dimension
% lsum(X,DIM) sums along dimension DIM
if nargin==1
DIM=1;
end
s=size(X);
if DIM == 1
% formula is:
% lz=log(bigger)+log(1+sum(exp(log(others)-log(bigger))))
% ************************************************************
X=sort(X,1); % just for find bigger in all dimensions
lz=X(end,:,:,:,:)+...
log(1+sum(exp(X(1:end-1,:,:,:,:)-...
repmat(X(end,:,:,:,:),[size(X,1)-1,1,1,1,1])),1));
% ************************************************************
else
% we put DIM to first dimension and do the same as before
X=permute(X,[ DIM, 1:DIM-1 , DIM+1:length(s)]);
% ************************************************************
X=sort(X,1);
lz=X(end,:,:,:,:)+...
log(1+sum(exp(X(1:end-1,:,:,:,:)-...
repmat(X(end,:,:,:,:),[size(X,1)-1,1,1,1,1])),1));
% *************************************************************
lz=permute(lz,[2:DIM, 1, DIM+1:length(s)]);
% we bring back dimesions
end