[AMPL 24523] 2d variable into c++ matrix

Hello,

I have a variable of the form t[j,i]. I would like to save these values into a 2D vector in C++…
I believe I should use the dataframe but I am a bit confuse on how to do it…
Is it possible? Anyone who knows how to do this?
Thank you!
Sam

Hi Sam,

You can retrieve the values into a DataFrame with: ampl::DafaFrame df = ampl.getVariable(“t”).getValues();

After that you can use a function such as the following to convert the DataFrame into a vector of vectors.

std::vector<std::vector> dataframe_to_vector(const ampl::DataFrame &df)
{
std::vector<std::vector> data;
int nrows = df.getNumRows();
int ncols = df.getNumCols();
data.reserve(nrows);
for (auto it = df.begin(); it != df.end(); it++)
{
data.push_back(std::vector(ncols));
for (int i = 0; i < ncols; i++)
{
data.back()[i] = (*it)[i].dbl();
}
}
return data;
}

For this type of questions asking on our new forum (https://discuss.ampl.com/) is better since it works a lot better with code.

1 Like

Thank you Filipe,

it doesn’t save the values as I expected though…maybe because in my variable t the number of columns depends on the number of rows through the parameter A??

var t{j in J, i in I: i<= A[ j ] } >= 0;

do I need to specify the value of A when I save the dataframe??
I apologize if I did not mention this sooner…
Thanks
Sam

Hi Sam,

The DataFrame should have three columns, one of index “i”, one for index “j”, and another for “t[i,j]”. Do you want to load this values into a matrix? You can do that as follows:

for (auto it = df.begin(); it != df.end(); it++)
{
int i = (int) (*it)[0].dbl();
int j = (int) (*it)[1].dbl();
double value = (*it)[2].dbl();
matrix[i][j] = value;
}