[GRASS-dev] Re: [GRASS-user] Compiling addons from svn repository
Glynn Clements
glynn at gclements.plus.com
Fri Nov 7 06:39:29 EST 2008
gianluca massei wrote:
> >> thank you for interesting about mcda. I need help and suggest for
> >> better coding!
> >>
> >> - Yes, r.mcda.electre, r.mcda.regime use
> >> G_alloc_matrix((nrows*ncols),(nrows*ncols)) with related memory
> >> problem. I'm looking for a better algorithm, especially for pairwise
> >> comparison that need large matrix ((nrows*ncols),(nrows*ncols)) for
> >> derive concordance and discordance matrix. Now I don't find it but I'
> >> still looking for. Could you give me a suggest ?.
> >>
> >
> > Is this a sparse matrix? Or do you actually store a value for every
> > possible combination?
> >
> > How is the resulting matrix used? If you don't need repeated, random
> > access, it would be better to calculate the values as they are
> > required instead of storing them.
>
> I need matrix for storage a pairwise comparison pixel to pixel for
> generate an index for each row/colum an re-generate the output grid. For
> avoid the problem I'm tinking storage the value in a file... but It
> dosen't a smart solution.
Looking at the code, it would appear that you don't need to store the
entire matrix, only the row/column sums. Something like the following
(untested):
void build_dominance_matrix(int nrows, int ncols, int ncriteria,
double *weight_vect, double ***decision_vol)
{
int row1, col1, row2, col2;
int i, j, k, cont;
double *row_sum_conc = G_alloc_vector(nrows * ncols);
double *col_sum_conc = G_alloc_vector(nrows * ncols);
double *row_sum_disc = G_alloc_vector(nrows * ncols);
double *col_sum_disc = G_alloc_vector(nrows * ncols);
k = 0; /* make pairwise comparation and build concordance/discordance matrix */
for (row1 = 0; row1 < nrows; row1++) {
G_percent(row1, nrows, 2);
for (col1 = 0; col1 < ncols; col1++) {
j = 0;
for (row2 = 0; row2 < nrows; row2++) {
for (col2 = 0; col2 < ncols; col2++) {
double conc = 0, disc = 0;
for (i = 0; i < ncriteria; i++) {
double d = decision_vol[row1][col1][i] - decision_vol[row2][col2][i];
if (d >= 0)
conc += weight_vect[i];
if (d > conc)
disc = -d;
}
row_sum_conc[k] += conc;
col_sum_conc[j] += conc;
row_sum_disc[k] += disc;
col_sum_disc[j] += disc;
j++; /* increase rows index up to nrows*ncols */
}
}
k++; /* increase columns index up to nrows*ncols */
}
}
/*calculate concordance and discordance index and storage in decision_vol */
cont = 0; /*variabile progressiva per riga/colonna della concordance_map */
for (row1 = 0; row1 < nrows; row1++) {
G_percent(row1, nrows, 2);
for (col1 = 0; col1 < ncols; col1++) {
/* da un valore incrementale ad ogni ciclo per progredire nella concordance_mat */
decision_vol[row1][col1][ncriteria] = row_sum_conc[cont] - col_sum_conc[cont]; /*fill matrix with concordance index for each DCELL */
decision_vol[row1][col1][ncriteria + 1] = row_sum_disc[cont] - col_sum_disc[cont]; /*fill matrix with discordance index for each DCELL */
cont++;
}
}
}
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev
mailing list