Hi,

I've got mixed results on different platforms when using more than one submatrix simultaneously.

Setup (code is attached):

Create two 2N-by-2N matrices A and B whose elements are given by:
   A(i,j) = i*N + j
   B(i,j) = i + j*N
Suppose we want to operate on A_ul and B_lr, the upper-left N-by-N submatrix of A and the lower-right N-by-N submatrix of B, respectively, and suppose we want to use submatrices instead of writing some loop-like code.

On one machine (CentOS 6) I get the following:

=== BEGIN ===
[matthias@guysborough gsl-matrix-view-test]$ gcc gsl-matrix-view-test.c -I /u7/matthias/opt/include -L /u7/matthias/opt/lib -lgsl -lgslcblas
[matthias@guysborough gsl-matrix-view-test]$ ldd a.out
        linux-vdso.so.1 =>  (0x00007fff8799b000)
        libgsl.so.0 => /u7/matthias/opt/lib/libgsl.so.0 (0x00007f00c2810000)
libgslcblas.so.0 => /u7/matthias/opt/lib/libgslcblas.so.0 (0x00007f00c25d6000)
        libc.so.6 => /lib64/libc.so.6 (0x000000309d600000)
        libm.so.6 => /lib64/libm.so.6 (0x000000309da00000)
        /lib64/ld-linux-x86-64.so.2 (0x000000309d200000)
[matthias@guysborough gsl-matrix-view-test]$ ./a.out
GSL version: 1.16

A = 0x17c6010
A->data = 0x17c6070
A->nrows = 40
A->ncols = 40

B = 0x17c9280
B->data = 0x17c92e0
B->nrows = 40
B->ncols = 40

A_ul = 0x7fffdb7bad70
A_ul->data = 0x17cac80
A_ul->nrows = 20
A_ul->ncols = 20

B_lr = 0x7fffdb7bad70
B_lr->data = 0x17cac80
B_lr->nrows = 20
B_lr->ncols = 20
=== END ===

So, the 'data' pointer of both A_ul and B_lr are the same??

If I run the same code on a Mac, I get something different:

=== BEGIN ===
wireless-10-145-113-144:gsl-matrix-view-test matthias$ gcc -lgsl -lgslcblas gsl-matrix-view-test.c -I /opt/local/include/ -L /opt/local/lib
wireless-10-145-113-144:gsl-matrix-view-test matthias$ otool -L a.out
a.out:
/opt/local/lib/libgsl.0.dylib (compatibility version 18.0.0, current version 18.0.0) /opt/local/lib/libgslcblas.0.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
wireless-10-145-113-144:gsl-matrix-view-test matthias$ ./a.out
GSL version: 1.16

A = 0x7fb6ca404b80
A->data = 0x7fb6ca803200
A->nrows = 40
A->ncols = 40

B = 0x7fb6ca404bc0
B->data = 0x7fb6ca806400
B->nrows = 40
B->ncols = 40

A_ul = 0x7fff5d212ad0
A_ul->data = 0x7fb6ca803200
A_ul->nrows = 20
A_ul->ncols = 20

B_lr = 0x7fff5d212aa0
B_lr->data = 0x7fb6ca807da0
B_lr->nrows = 20
B_lr->ncols = 20
=== END ===

So, here the 'data' pointer is correct and differs for both submatrices.

I'm really puzzled... Any ideas what might be going on here??

MS

--
Dr. Matthias Sitte
The University of Texas at Austin
Department of Physics
2515 Speedway, C1600
Austin, TX 78712-1192
#include <stdio.h>
#include <stdlib.h>

#include <gsl/gsl_matrix.h>
#include <gsl/gsl_version.h>

#define N 20

/**
 * Create two 2N-by-2N matrices A and B whose elements are given by:
 *   A(i,j) = i*N + j
 *   B(i,j) = i + j*N
 * Suppose we want to operate on A_ul and B_lr, the upper-left N-by-N submatrix
 * of A and the lower-right N-by-N submatrix of B, respectively, and suppose we
 * want to use submatrices instead of writing some loop-like code.
 */
int
main (int argc, char ** argv)
{
  size_t i, j;
  gsl_matrix *A, *A_ul, *B, *B_lr;

  fprintf (stderr, "GSL version: %s\n\n", gsl_version);

  /* Initialize A and B */
  A = gsl_matrix_alloc (2*N, 2*N);
  for (i = 0; i < 2*N; i++)
    {
      for (j = 0; j < 2*N; j++)
        gsl_matrix_set (A, i, j, i * 2*N + j);
    }

  B = gsl_matrix_alloc (2*N, 2*N);
  for (i = 0; i < 2*N; i++)
    {
      for (j = 0; j < 2*N; j++)
        gsl_matrix_set (B, i, j, i + j * 2*N);
    }

  /* Dump gsl_matrix structs. */
  fprintf (stderr, "A = %p\n", A);
  fprintf (stderr, "A->data = %p\n", A->data);
  fprintf (stderr, "A->nrows = %lu\n", A->size1);
  fprintf (stderr, "A->ncols = %lu\n", A->size2);
  fputc ('\n', stderr);

  fprintf (stderr, "B = %p\n", B);
  fprintf (stderr, "B->data = %p\n", B->data);
  fprintf (stderr, "B->nrows = %lu\n", B->size1);
  fprintf (stderr, "B->ncols = %lu\n", B->size2);
  fputc ('\n', stderr);

  /* Get upper-left and lower-right submatrices. */
  {
    gsl_matrix_view view1 = gsl_matrix_submatrix (A, 0, 0, N, N);
    A_ul = &(view1.matrix);
  }

  {
    gsl_matrix_view view2 = gsl_matrix_submatrix (B, N, N, N, N);
    B_lr = &(view2.matrix);
  }

  /* Dump gsl_matrix structs of submatrices. */
  fprintf (stderr, "A_ul = %p\n", A_ul);
  fprintf (stderr, "A_ul->data = %p\n", A_ul->data);
  fprintf (stderr, "A_ul->nrows = %lu\n", A_ul->size1);
  fprintf (stderr, "A_ul->ncols = %lu\n", A_ul->size2);
  fputc ('\n', stderr);

  fprintf (stderr, "B_lr = %p\n", B_lr);
  fprintf (stderr, "B_lr->data = %p\n", B_lr->data);
  fprintf (stderr, "B_lr->nrows = %lu\n", B_lr->size1);
  fprintf (stderr, "B_lr->ncols = %lu\n", B_lr->size2);
  fputc ('\n', stderr);

  gsl_matrix_free (A);
  gsl_matrix_free (B);

  return 0;
}
[matthias@guysborough gsl-matrix-view-test]$ gcc gsl-matrix-view-test.c -I 
/u7/matthias/opt/include -L /u7/matthias/opt/lib -lgsl -lgslcblas
[matthias@guysborough gsl-matrix-view-test]$ ldd a.out
        linux-vdso.so.1 =>  (0x00007fff8799b000)
        libgsl.so.0 => /u7/matthias/opt/lib/libgsl.so.0 (0x00007f00c2810000)
        libgslcblas.so.0 => /u7/matthias/opt/lib/libgslcblas.so.0 
(0x00007f00c25d6000)
        libc.so.6 => /lib64/libc.so.6 (0x000000309d600000)
        libm.so.6 => /lib64/libm.so.6 (0x000000309da00000)
        /lib64/ld-linux-x86-64.so.2 (0x000000309d200000)
[matthias@guysborough gsl-matrix-view-test]$ ./a.out
GSL version: 1.16

A = 0x17c6010
A->data = 0x17c6070
A->nrows = 40
A->ncols = 40

B = 0x17c9280
B->data = 0x17c92e0
B->nrows = 40
B->ncols = 40

A_ul = 0x7fffdb7bad70
A_ul->data = 0x17cac80
A_ul->nrows = 20
A_ul->ncols = 20

B_lr = 0x7fffdb7bad70
B_lr->data = 0x17cac80
B_lr->nrows = 20
B_lr->ncols = 20
wireless-10-145-113-144:gsl-matrix-view-test matthias$ gcc -lgsl -lgslcblas 
gsl-matrix-view-test.c -I /opt/local/include/ -L /opt/local/lib
wireless-10-145-113-144:gsl-matrix-view-test matthias$ otool -L a.out
a.out:
  /opt/local/lib/libgsl.0.dylib (compatibility version 18.0.0, current version 
18.0.0)
  /opt/local/lib/libgslcblas.0.dylib (compatibility version 1.0.0, current 
version 1.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 
1213.0.0)
wireless-10-145-113-144:gsl-matrix-view-test matthias$ ./a.out
GSL version: 1.16

A = 0x7fb6ca404b80
A->data = 0x7fb6ca803200
A->nrows = 40
A->ncols = 40

B = 0x7fb6ca404bc0
B->data = 0x7fb6ca806400
B->nrows = 40
B->ncols = 40

A_ul = 0x7fff5d212ad0
A_ul->data = 0x7fb6ca803200
A_ul->nrows = 20
A_ul->ncols = 20

B_lr = 0x7fff5d212aa0
B_lr->data = 0x7fb6ca807da0
B_lr->nrows = 20
B_lr->ncols = 20

Reply via email to