如何自动生成和分配矩阵中元素对应的变量?

时间:2013-02-15 15:58:35

标签: c++ python matlab optimization matrix

我正在研究二元线性程序问题。

我对任何计算机语言都不熟悉(只学习Java和C ++几个月),但我可能不得不使用计算机,因为问题非常复杂。

第一步是为矩阵M中的每个条目(至少8×8)声明变量m_ij。 然后,我将矩阵的每个元素的相应值分配给这些变量中的每一个。

接下来是每当m_ij的值不为0时,生成其他变量集x_ij1,x_ij2,x_ij3,x_ij4和x_ij5。 x_ijk变量的值为0或1,我不必为x_ijk变量赋值。

最简单的方法可能是为每个变量声明并赋值,例如

int* m_11 = 5, int* m_12 = 2, int* m_13 = 0, ... int* m_1n = 1

int* m_21 = 3, int* m_12 = 1, int* m_13 = 2, ... int* m_2n = 3

然后选择变量,其值不为0,并相应地声明x_ij1~x_ij5。

但这可能是太多的工作,特别是因为我将考虑许多不同的矩阵来解决这个问题。

有没有办法自动完成?

我知道一点Java和C ++,我正在考虑在C ++中使用lp_solve包(以解决二进制整数线性程序问题),但如果我能够轻松地使用它,我愿意使用任何其他语言或程序。

我确信必须有一些方法可以做到这一点(可能是使用循环,我猜?),这是一个非常简单的任务,但我只是不知道它,因为我没有太多的编程语言。

我的一个同事编写了一个程序,用于生成满足我们需要的某些条件的随机矩阵,所以如果我可以使用该矩阵作为我的输入,它可能是理想的,但是任何方式这样做都可以。

比方说,如果有办法用MS excel做,比如将矩阵条目放到excel文件中的单元格中,然后将其导入C ++并自动生成变量并为它们赋值,那么这将简化任务很多!

3 个答案:

答案 0 :(得分:0)

在C ++中,您可以使用std::vector向量,例如

std::vector<std::vector<int>> matrix;

你不需要为矩阵值使用单独的变量,为什么你有矩阵?

我不明白您需要在评估truefalse时获取所有值的原因。相反,只需将条件评估为std::vector的坐标直接放入true

std::vector<std::pair<int, int> true_values;
for (int i = 0; i < matrix.size(); i++)
{
    for (int j = 0; j < matrix[i].size(); j++)
    {
        if (some_condition_for_this_matrix_value(matrix[i][j], i, j) == true)
            true_values.emplace_back(std::make_pair(i, j));
    }
}

现在你有一个所有矩阵坐标的向量,其条件是true


如果您确实想同时拥有truefalse值,则可以使用std::unordered_map,其中std::pair包含矩阵坐标作为键,bool作为价值:

// Create a type alias, as this type will be used multiple times
typedef std::map<std::pair<int, int>, bool> bool_map_type;
bool_map_type bool_map;

从矩阵中插入所有值,矩阵的坐标为关键点,地图值为truefalse,具体取决于您拥有的条件。

要获取bool_map中所有条目的列表,您可以删除std::remove_if的所有false条目:

std::remove_if(bool_map.begin(), bool_map.end(),
    [](const bool_map_type::value_type& value) {
        return value.second == false;
    };

现在您的地图只包含值为true的条目。迭代此映射以获取矩阵的坐标


当然,我可能完全误解了你的问题,在这种情况下你当然可以自由地忽略这个答案。 :)

答案 1 :(得分:0)

我知道C ++和Matlab(不是Python),在你的情况下,我真的会选择Matlab,因为当你开始编程时它更容易使用(但是当你发现它时不要忘记回到C ++) Matlab的局限性。)

在Matlab中,您可以非常轻松地定义矩阵:只需键入矩阵的名称和要设置的索引:

m(1,1) = 1
m(2,2) = 1

为您提供2x2单位矩阵(索引在Matlab中以1开头,默认情况下条目为0)。您也可以用相同的方式定义3d矩阵:

x(1,2,3) = 2

对于从Excel导入,可以将您的Excel文件保存为CSV格式,您可以使用函数dlmread在Matlab中读取它。您也可以稍后尝试在Matlab中直接实现算法。

最后,如果你想解决二进制整数程序,Matlab中已经有一个内置函数,叫做bintprog,它可以为你解决。

希望它有所帮助!

答案 2 :(得分:0)

Matlab确实看起来非常适合这项任务。虽然@Dr_Sam提供的示例确实会动态创建矩阵,但我建议您在分配值之前初始化它们。这样,如果工作空间中已经存在具有相同名称的内容,您的代码仍会以正确的变量结束,并且您的变量将始终具有预期的大小。

假设您要定义一个方形8x8矩阵:

m = zeros(8)

现在一般来说,如果你想初始化一个大小为imaxjmaxkmax的三维矩阵:

imax = 8;
jmax = 8;
kmax = 5;
x = zeros(imax,jmax,kmax);

现在分配或读取这些矩阵非常容易,请注意,长度和m的选择与x的第一个维度相同:

m(3,4) = 4; %Assign a value
myvalue = m(3,4) %read the value
m(:,1) = 1:8 *Assign the values 1 through 8 to the first column

x(2,4,5) = 12; %Assign a single value to the three dimensional matrix
x(:,:,2) = m+1; Assign the entire matrix plus one to one of the planes in x.