/usr/share/octave/packages/statistics-1.2.3/squareform.m is in octave-statistics 1.2.3-1.
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 | ## Copyright (C) 2006, 2008 Bill Denney <bill@denney.ws>
##
## This program 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.
##
## This program 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
## this program; if not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
## @deftypefn {Function File} {@var{y} =} squareform (@var{x})
## @deftypefnx {Function File} {@var{y} =} squareform (@var{x}, @
## "tovector")
## @deftypefnx {Function File} {@var{y} =} squareform (@var{x}, @
## "tomatrix")
## Convert a vector from the pdist function into a square matrix or from
## a square matrix back to the vector form.
##
## The second argument is used to specify the output type in case there
## is a single element.
## @seealso{pdist}
## @end deftypefn
## Author: Bill Denney <bill@denney.ws>
function y = squareform (x, method)
if nargin < 1
print_usage ();
elseif nargin < 2
if isscalar (x) || isvector (x)
method = "tomatrix";
elseif issquare (x)
method = "tovector";
else
error ("squareform: cannot deal with a nonsquare, nonvector \
input");
endif
endif
method = lower (method);
if ! strcmp ({"tovector" "tomatrix"}, method)
error ("squareform: method must be either \"tovector\" or \
\"tomatrix\"");
endif
if strcmp ("tovector", method)
if ! issquare (x)
error ("squareform: x is not a square matrix");
endif
sx = size (x, 1);
y = zeros ((sx-1)*sx/2, 1);
idx = 1;
for i = 2:sx
newidx = idx + sx - i;
y(idx:newidx) = x(i:sx,i-1);
idx = newidx + 1;
endfor
else
## we're converting to a matrix
## make sure that x is a column
x = x(:);
## the dimensions of y are the solution to the quadratic formula
## for:
## length(x) = (sy-1)*(sy/2)
sy = (1 + sqrt (1+ 8*length (x)))/2;
y = zeros (sy);
for i = 1:sy-1
step = sy - i;
y((sy-step+1):sy,i) = x(1:step);
x(1:step) = [];
endfor
y = y + y';
endif
endfunction
## make sure that it can go both directions automatically
%!assert(squareform(1:6), [0 1 2 3;1 0 4 5;2 4 0 6;3 5 6 0])
%!assert(squareform([0 1 2 3;1 0 4 5;2 4 0 6;3 5 6 0]), [1:6]')
## make sure that the command arguments force the correct behavior
%!assert(squareform(1), [0 1;1 0])
%!assert(squareform(1, "tomatrix"), [0 1;1 0])
%!assert(squareform(1, "tovector"), zeros(0,1))
|