/usr/share/octave/packages/communications-1.2.0/systematize.m is in octave-communications-common 1.2.0-2.
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 | ## Copyright (C) 2007 Muthiah Annamalai <muthiah.annamalai@uta.edu>
##
## 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} {} systematize (@var{G})
##
## Given @var{G}, extract P parity check matrix. Assume row-operations in GF(2).
## @var{G} is of size KxN, when decomposed through row-operations into a @var{I} of size KxK
## identity matrix, and a parity check matrix @var{P} of size Kx(N-K).
##
## Most arbitrary code with a given generator matrix @var{G}, can be converted into its
## systematic form using this function.
##
## This function returns 2 values, first is default being @var{Gx} the systematic version of
## the @var{G} matrix, and then the parity check matrix @var{P}.
##
## @example
## @group
## g = [1 1 1 1; 1 1 0 1; 1 0 0 1];
## [gx, p] = systematize (g);
## @result{} gx = [1 0 0 1; 0 1 0 0; 0 0 1 0];
## @result{} p = [1 0 0];
## @end group
## @end example
## @seealso{bchpoly, biterr}
## @end deftypefn
function [G, P] = systematize (G)
if (nargin != 1)
print_usage ();
endif
[K, N] = size (G);
if (K >= N)
error ("systematize: G must be a KxN matrix, with K < N");
endif
##
## gauss-jordan echelon formation,
## and then back-operations to get I of size KxK
## remaining is the P matrix.
##
for row = 1:K
##
## pick a pivot for this row, by finding the
## first of remaining rows that have non-zero element
## in the pivot.
##
found_pivot = 0;
if (G(row,row) > 0)
found_pivot = 1;
else
##
## next step of Gauss-Jordan, you need to
## re-sort the remaining rows, such that their
## pivot element is non-zero.
##
for idx = row+1:K
if (G(idx,row) > 0)
tmp = G(row,:);
G(row,:) = G(idx,:);
G(idx,:) = tmp;
found_pivot = 1;
break;
endif
endfor
endif
##
## some linearly dependent problems:
##
if (!found_pivot)
error ("systematize: could not systematize matrix G");
return
endif
##
## Gauss-Jordan method:
## pick pivot element, then remove it
## from the rest of the rows.
##
for idx = row+1:K
if (G(idx,row) > 0)
G(idx,:) = mod (G(idx,:) + G(row,:), 2);
endif
endfor
endfor
##
## Now work-backward.
##
for row = K:-1:2
for idx = row-1:-1:1
if (G(idx,row) > 0)
G(idx,:) = mod (G(idx,:) + G(row,:), 2);
endif
endfor
endfor
#I = G(:,1:K);
P = G(:,K+1:end);
endfunction
%% Test input validation
%!error systematize ()
%!error systematize (1, 2)
%!error systematize (eye (3))
|