/usr/share/octave/packages/signal-1.2.2/cplxreal.m is in octave-signal 1.2.2-1build1.
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 | %% Copyright (C) 2005 Julius O. Smith III <jos@ccrma.stanford.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} {[@var{zc}, @var{zr}] =} cplxreal (@var{z}, @var{thresh})
%% Split the vector z into its complex (@var{zc}) and real (@var{zr}) elements,
%% eliminating one of each complex-conjugate pair.
%%
%% INPUTS:@*
%% @itemize
%% @item
%% @var{z} = row- or column-vector of complex numbers@*
%% @item
%% @var{thresh} = tolerance threshold for numerical comparisons (default = 100*eps)
%% @end itemize
%%
%% RETURNED:@*
%% @itemize
%% @item
%% @var{zc} = elements of @var{z} having positive imaginary parts@*
%% @item
%% @var{zr} = elements of @var{z} having zero imaginary part@*
%% @end itemize
%%
%% Each complex element of @var{z} is assumed to have a complex-conjugate
%% counterpart elsewhere in @var{z} as well. Elements are declared real
%% if their imaginary parts have magnitude less than @var{thresh}.
%%
%% @seealso{cplxpair}
%% @end deftypefn
function [zc,zr] = cplxreal (z, thresh = 100*eps)
% interesting for testing: if nargin<2, thresh=1E-3; end
if isempty(z)
zc=[];
zr=[];
else
zcp = cplxpair(z); % sort complex pairs, real roots at end
nz = length(z);
nzrsec = 0;
i=nz;
while i && abs(imag(zcp(i)))<thresh % determine no. of real values
zcp(i) = real(zcp(i));
nzrsec = nzrsec+1;
i=i-1;
end
nzsect2 = nz-nzrsec;
if mod(nzsect2,2)~=0
error('cplxreal: Odd number of complex values!');
end
nzsec = nzsect2/2;
zc = zcp(2:2:nzsect2);
zr = zcp(nzsect2+1:nz);
end
endfunction
%!test
%! [zc,zr] = cplxreal(roots([1 0 0 1]));
%! assert({zc,zr},{0.5+i*sin(pi/3),-1},10*eps);
|