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

How to auto-generate and assign variables corresponding to elements in a matrix?

本文关键字:元素 相对 变量 自动生成 分配      更新时间:2023-10-16

我正在处理一个二进制线性程序问题。

我对任何计算机语言都不太熟悉(刚刚学习了几个月Java和C++),但由于问题相当复杂,我可能无论如何都要使用计算机。

第一步是为矩阵m中(至少8 X 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++,自动生成变量并为其赋值,那么这将大大简化任务!

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.

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

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

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

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

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的条目的映射。在这个地图上迭代以获得矩阵的坐标


当然,我可能完全误解了你的问题,在这种情况下,你当然可以无视这个答案

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

在Matlab中,您可以很容易地定义矩阵:只需键入矩阵的名称和要设置的索引:

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

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

x(1,2,3) = 2

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

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

希望它能有所帮助!