Хранить несколько матриц (GSL) на карте

У меня есть несколько матриц, которые я хотел бы сохранить в каком-то объекте c/c++. Я все еще очень новичок в c/c++, но мне сказали, что это один из способов сделать это.

  1. Создать карту
  2. Хранить матрицы по ключам карты

Вот почти рабочий MWE (если бы он работал, мне не нужно было бы задавать этот вопрос):

#include <map>
#include <stdio.h>
#include <stdio.h>
#include <gsl/gsl_matrix.h>

int
main (void)
{
  int i, j; 
  std::map<int,double> test;
  gsl_matrix * m = gsl_matrix_alloc (10, 3);

  for (i = 0; i < 10; i++)
    for (j = 0; j < 3; j++)
      gsl_matrix_set (m, i, j, 0.23 + 100*i + j);
  // store in map
  test[1] = m;
  gsl_matrix_free (m);

  return 0;
}

Я становлюсь неуверенным (и возникает ошибка) в этой строке:

std::map<int,double> test;

потому что gsl_matrix — это структура, и я считаю, что это несовместимо с тем, что я хочу сделать. Ошибка гласит:

cannot convert gsl_matrix* to std::map<int, double>::mapped_type {aka double} in assignment

Если быть точным, то, что я хочу сделать, похоже на python, где мы можем просто хранить объекты в словарях следующим образом:

import numpy as np
test = {}
test['a'] = np.array([[1,2],[2,3]])
test['b'] = np.array([[1,2],[3,3]])
test['c'] = np.array([[1,3],[5,3]])
test['d'] = np.array([[1,5],[6,3]])
.
.
.

Как это лучше всего воспроизвести с помощью gsl?


person Astrid    schedule 06.12.2017    source источник


Ответы (1)


Во-первых, я не программист на C++!

Однако я почти уверен, что вы хотите указать значение карты как gsl_matrix *. Следующее компилируется без каких-либо ошибок, однако я думаю, что вам может понадобиться реализовать операторы std::map.

#include <map>
#include <stdio.h>
#include <stdio.h>
#include <gsl/gsl_matrix.h>

int
main (void)
{
        int i;
        int j;
        std::map<int, gsl_matrix *> test;

        gsl_matrix * m = gsl_matrix_alloc (10, 3);

        for (i = 0; i < 10; i++) {
                for (j = 0; j < 3; j++) {
                        gsl_matrix_set(m, i, j, 0.23 + 100*i + j);
                }
        }
        // store in map
        test[1] = m;
        gsl_matrix_free(m);
        return 0;
}

Затем для компиляции:

g++ -o test test.cpp -lgsl -lgslcblas

Надеюсь, это поможет!

person Timothy Brown    schedule 19.12.2017