This file is indexed.

/usr/share/freemat/toolbox/graph/hist.m is in freemat-data 4.0-5.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
% HIST HIST Histogram Function
% 
% Usage
% 
% 
% 	n=hist (y)
% 	n=hist (y,x)
% 	n=hist (y,x,norm)
% 
%  Produce histogram counts or plots.
% 
%  With one vector input argument, plot a histogram of the values with
%  10 bins.  The range of the histogram bins is determined by the range
%  of the data.
% 
%  Given a second scalar argument, use that as the number of bins.
% 
%  Given a second vector argument, use that as the centers of the bins,
%  with the width of the bins determined from the adjacent values in
%  the vector.
% 
%  If third argument is provided, the histogram is normalised such that
%  the sum of the bars is equal to norm.
% 
%  Extreme values are lumped in the first and last bins.
% 

%% Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003,
%%               2004, 2005, 2006, 2007 John W. Eaton
%%
%% Copyright (C) 2008 Samit Basu, Eugene Ingerman
%%
%% This file is adopted in FreeMat from Octave under the conditions of the GNU 
%% General Public License
%%
%% Octave is free software; you can redistribute it and/or modify it
%% under the terms of the GNU General Public License as published by
%% the Free Software Foundation; either version 3 of the License, or (at
%% your option) any later version.
%%
%% Octave is distributed in the hope that it will be useful, but
%% WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%% General Public License for more details.
%%
%% You should have received a copy of the GNU General Public License
%% along with Octave; see the file COPYING.  If not, see
%% <http://www.gnu.org/licenses/>.
%% Author: jwe

function [nn, xx] = hist (y, varargin)

  if (nargin < 1)
    error('Not enough input parameters');
  end

  arg_is_vector = isvector (y);

  if (size(y,1) == 1)
    y = y(:);
  end

  if (isreal (y))
    max_val = max (y(:));
    min_val = min (y(:));
  else
    error ('hist: first argument must be a vector');
  end

  iarg = 1;
  if (nargin == 1 || ischar (varargin{iarg}))
    n = 10;
    x = [0.5:n]'/n;
    x = x * (max_val - min_val) + ones(size(x)) * min_val;
  else
    %% nargin is either 2 or 3
    x = varargin{iarg};
    iarg=iarg+1;
    if (isscalar (x))
      n = x;
      if (n <= 0)
        error ('hist: number of bins must be positive');
      end
      x = [0.5:n]'/n;
      x = x * (max_val - min_val) + ones (size (x)) * min_val;
    elseif (isreal (x))
      if (isvector (x))
		x = x(:);
      end
      tmp = sort (x);
      if (any (tmp ~= x))
        warning ('hist: bin values not sorted on input');
        x = tmp;
      end
    else
      error ('hist: second argument must be a scalar or a vector');
    end
  end

  %% Avoid issues with integer types for x and y
  x = double (x);
  y = double (y);

  cutoff = (x(1:end-1,:) + x(2:end,:)) / 2;
  n = size(x,1);
  if (n < 30 && size(x,2) == 1)
    %% The following algorithm works fastest for n less than about 30.
    chist = zeros (n+1, size(y,2));
    for i = 1:n-1
      chist(i+1,:) = sum (y <= cutoff(i));
    end
    chist(n+1,:) = sum (~isnan (y));
  else
    %% The following algorithm works fastest for n greater than about 30.
    %% Put cutoff elements between boundaries, integrate over all
    %% elements, keep totals at boundaries.
    [s, idx] = sort ([y; cutoff]);
    len = size (y,1);
    chist = cumsum (idx <= len);
    t1 = zeros (1, columns (y));
    t2 = reshape (chist(idx > len), size (cutoff));
    t3 = chist(end,:) - sum (isnan (y));
    chist = [t1; t2; t3];
  end

  freq = diff (chist);

  if (nargin > 2 && ~ischar(varargin{iarg}))
    %% Normalise the histogram.
    norm = varargin{iarg++};
    freq = freq / rows (y) * norm;
  end

  if (nargout > 0)
    if (arg_is_vector)
      nn = freq';
      xx = x';
    else
      nn = freq;
      xx = x;
    end
  elseif (size (freq, 2) ~= 1)
    bar (x, freq, 0.8, varargin{iarg:end});
  else
    bar (x, freq, 1.0, varargin{iarg:end});
  end

 % function y=diff(x)
	% y=x(2:end)-x(1:end-1);
	
function h=bar( x, y, width, varargin )

	x=x(:);
	y=y(:);
	if (length(x) ~= length(y))
		error('cannot handle this case');
	end
		
	df = width*diff( x )/2;
   df(end+1) = df(end);
	x_r=x(1:end)-df;
	x_l=x(1:end)+df;
	
	n = length(x);
	vertices = [ x_r zeros(size(x_r)) ones(size(x_r)) ;...
				x_r y ones(size(x_r)) ;...
				x_l y ones(size(x_r)) ;...
				x_l zeros(size(x_l)) ones(size(x_r))];
	
	ind=(1:n)';
   faces = [ind ind+n ind+2*n ind+3*n];
   if ~ishold
      clf
   end
   h=patch('Faces',faces,'Vertices',vertices,'FaceColor',[0 0 1]);

%test
%  [nn,xx]=hist([1:4],3);
%  assert(xx, [1.5,2.5,3.5]);
%  assert(nn, [2,1,1]);
%test
%  [nn,xx]=hist([1:4]',3);
%  assert(xx, [1.5,2.5,3.5]);
%  assert(nn, [2,1,1]);
%test
%  [nn,xx]=hist([1 1 1 NaN NaN NaN 2 2 3],[1 2 3]);
%  assert(xx, [1,2,3]);
%  assert(nn, [3,2,1]);
%test
%  [nn,xx]=hist([[1:4]',[1:4]'],3);
%  assert(xx, [1.5;2.5;3.5]);
%  assert(nn, [[2,1,1]',[2,1,1]']);
%assert(hist(1,1),1);
%test
%  for n = [10, 30, 100, 1000]
%    assert( sum(hist([1:n], n)), n );
%    assert( sum(hist([1:n], [2:n-1])), n);
%    assert( sum(hist([1:n], [1:n])), n );
%    assert( sum(hist([1:n], 29)), n);
%    assert( sum(hist([1:n], 30)), n);
%  endfor