projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
math: Make 'accumulate' a feature of order statistics, not all stats.
[pspp]
/
src
/
language
/
stats
/
matrix.c
diff --git
a/src/language/stats/matrix.c
b/src/language/stats/matrix.c
index b1ec91474dbf88d0eda8fc9cd11172e85b17cf57..9bbc37f9a23e4c09ef72f052b46365b369648943 100644
(file)
--- a/
src/language/stats/matrix.c
+++ b/
src/language/stats/matrix.c
@@
-1851,21
+1851,24
@@
matrix_eval_IDENT (double s1, double s2)
return m;
}
return m;
}
+/* Inverts X, storing the inverse into INVERSE. As a side effect, replaces X
+ by its LU decomposition. */
static void
static void
-invert_matrix (gsl_matrix *x)
+invert_matrix (gsl_matrix *x
, gsl_matrix *inverse
)
{
gsl_permutation *p = gsl_permutation_alloc (x->size1);
int signum;
gsl_linalg_LU_decomp (x, p, &signum);
{
gsl_permutation *p = gsl_permutation_alloc (x->size1);
int signum;
gsl_linalg_LU_decomp (x, p, &signum);
- gsl_linalg_LU_inv
x (x, p
);
+ gsl_linalg_LU_inv
ert (x, p, inverse
);
gsl_permutation_free (p);
}
static gsl_matrix *
gsl_permutation_free (p);
}
static gsl_matrix *
-matrix_eval_INV (gsl_matrix *
m
)
+matrix_eval_INV (gsl_matrix *
src
)
{
{
- invert_matrix (m);
- return m;
+ gsl_matrix *dst = gsl_matrix_alloc (src->size1, src->size2);
+ invert_matrix (src, dst);
+ return dst;
}
static gsl_matrix *
}
static gsl_matrix *
@@
-3405,7
+3408,10
@@
matrix_expr_evaluate_exp_mat (const struct matrix_expr *e,
mul_matrix (&y, x, y, &t);
if (bf < 0)
mul_matrix (&y, x, y, &t);
if (bf < 0)
- invert_matrix (y);
+ {
+ invert_matrix (y, x);
+ swap_matrix (&x, &y);
+ }
/* Garbage collection.
/* Garbage collection.
@@
-6148,7
+6154,7
@@
save_file_open (struct save_file *sf, gsl_matrix *m,
struct stringi_set strings;
stringi_set_clone (&strings, &sf->strings);
struct stringi_set strings;
stringi_set_clone (&strings, &sf->strings);
- for (size_t i = 0; dict_get_
var_cnt
(dict) < m->size2; i++)
+ for (size_t i = 0; dict_get_
n_vars
(dict) < m->size2; i++)
{
char tmp_name[64];
const char *name;
{
char tmp_name[64];
const char *name;
@@
-7431,7
+7437,7
@@
matrix_get_execute__ (struct matrix_command *cmd, struct casereader *reader,
}
else
{
}
else
{
- n_vars = dict_get_
var_cnt
(dict);
+ n_vars = dict_get_
n_vars
(dict);
vars = xnmalloc (n_vars, sizeof *vars);
for (size_t i = 0; i < n_vars; i++)
{
vars = xnmalloc (n_vars, sizeof *vars);
for (size_t i = 0; i < n_vars; i++)
{
@@
-7499,7
+7505,7
@@
matrix_get_execute__ (struct matrix_command *cmd, struct casereader *reader,
error = true;
}
}
error = true;
}
}
- else if (var_is_num_missing (var, d
, MV_USER)
)
+ else if (var_is_num_missing (var, d
) == MV_USER
)
{
if (get->user.treatment == MGET_RECODE)
d = get->user.substitute;
{
if (get->user.treatment == MGET_RECODE)
d = get->user.substitute;
@@
-7545,7
+7551,7
@@
matrix_open_casereader (const struct matrix_command *cmd,
}
else
{
}
else
{
- if (dict_get_
var_cnt
(dataset_dict (dataset)) == 0)
+ if (dict_get_
n_vars
(dataset_dict (dataset)) == 0)
{
msg_at (ME, cmd->location,
_("The %s command cannot read an empty active file."),
{
msg_at (ME, cmd->location,
_("The %s command cannot read an empty active file."),
@@
-8222,7
+8228,7
@@
matrix_mget_commit_var (struct ccase **rows, size_t n_rows,
{
struct variable *var = dict_get_var (d, cs + x);
double value = case_num (rows[y], var);
{
struct variable *var = dict_get_var (d, cs + x);
double value = case_num (rows[y], var);
- if (var_is_num_missing (var, value
, MV_ANY
))
+ if (var_is_num_missing (var, value))
{
n_missing++;
value = 0.0;
{
n_missing++;
value = 0.0;
@@
-8286,13
+8292,13
@@
matrix_mget_execute__ (struct matrix_command *cmd, struct casereader *r,
_("ROWTYPE_ must precede VARNAME_ in matrix data file."));
return;
}
_("ROWTYPE_ must precede VARNAME_ in matrix data file."));
return;
}
- if (var_get_dict_index (varname_) + 1 >= dict_get_
var_cnt
(d))
+ if (var_get_dict_index (varname_) + 1 >= dict_get_
n_vars
(d))
{
msg_at (SE, loc, _("Matrix data file contains no continuous variables."));
return;
}
{
msg_at (SE, loc, _("Matrix data file contains no continuous variables."));
return;
}
- for (size_t i = 0; i < dict_get_
var_cnt
(d); i++)
+ for (size_t i = 0; i < dict_get_
n_vars
(d); i++)
{
const struct variable *v = dict_get_var (d, i);
if (v != rowtype_ && v != varname_ && var_get_width (v) != 0)
{
const struct variable *v = dict_get_var (d, i);
if (v != rowtype_ && v != varname_ && var_get_width (v) != 0)
@@
-8318,7
+8324,7
@@
matrix_mget_execute__ (struct matrix_command *cmd, struct casereader *r,
/* Continuous variables. */
size_t cs = var_get_dict_index (varname_) + 1;
/* Continuous variables. */
size_t cs = var_get_dict_index (varname_) + 1;
- size_t cn = dict_get_
var_cnt
(d) - cs;
+ size_t cn = dict_get_
n_vars
(d) - cs;
struct ccase *cc = NULL;
/* Pivot table. */
struct ccase *cc = NULL;
/* Pivot table. */