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

2024-10-03 06:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个二进制线性规划问题。

我对任何计算机语言(刚刚学习了java和C++)都不熟悉,但我可能不得不使用计算机,因为问题很复杂。

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

下一步是生成其他变量集,即x_ij1、x_ij2、x_ij3、x_ij4和x_ij5,只要m_ij的值不是0。 x_ijk variable的值为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++中考虑使用LPyS解包(解决二进制整数线性规划问题),但是如果我能很容易地使用它,我愿意使用任何其他语言或程序。

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

我的一个团队写了一个程序来生成一个满足我们需要的条件的随机矩阵,所以如果我可以用这个矩阵作为输入,这可能是理想的,但是现在任何方法都可以。

说,如果有一种方法可以用MS Excel来做,比如把矩阵项放在Excel文件中的单元格,并将其导入C++,并自动生成变量并赋值给它们,那么这将大大简化任务!


Tags: 方法程序语言声明计算机二进制矩阵java
3条回答
<>我知道C++和Matlab(不是Python),在你的例子中,我真的要去MATLAB,因为在开始编程时使用起来更容易(但是不要忘记当你发现Matlab的局限性时回到C++)。在

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

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

给出一个2x2单位矩阵(在Matlab中,索引从1开始,默认情况下条目为0)。也可以用同样的方法定义三维矩阵:

^{pr2}$

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

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

希望有帮助!在

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

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

m = zeros(8)

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

^{pr2}$

现在给这些矩阵赋值或从中读取非常容易,注意m的长度和with被选择为与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++中,你可以使用一个向量{^ a},比如

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

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

我不明白为什么你需要得到所有你计算truefalse的值。相反,只需将条件计算结果为true的坐标直接放入std::vector

^{pr2}$

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


如果您真的想同时拥有truefalse值,可以使用^{}和一个^{}^{}作为键,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;

将矩阵中的所有值插入到该映射中,矩阵的坐标为键,映射值为true或{},具体取决于您的条件。在

要获取bool_map中所有条目的列表,可以删除带有^{}false条目:

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

{现在只有一个包含cd2}值的条目。在这个地图上迭代以得到矩阵的坐标


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

相关问题 更多 >