C++ 如何自动生成和分配矩阵中元素对应的变量?
我正在研究一个二元线性规划问题 我对任何计算机语言(刚刚学习了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变量赋值 可能最简单的方法是声明每个变量并为其赋值,例如C++ 如何自动生成和分配矩阵中元素对应的变量?,c++,python,matlab,optimization,matrix,C++,Python,Matlab,Optimization,Matrix,我正在研究一个二元线性规划问题 我对任何计算机语言(刚刚学习了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
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
<>但是这可能是太多的工作,特别是因为我要考虑这个问题的许多不同的矩阵。< /P>
有没有什么方法可以自动做到这一点
<>我知道一点java和C++,我在C++中考虑使用LPyS解包(解决二进制整数线性规划问题),但是如果我能很容易地使用它,我愿意使用任何其他语言或程序。
我确信一定有办法做到这一点(我想可能是使用循环吧?),这是一项非常简单的任务,但我只是不知道,因为我没有太多的编程语言
我的一个同伴写了一个程序,用来生成一个满足我们需要的条件的随机矩阵,所以如果我可以使用这个矩阵作为输入,这可能是理想的,但现在任何方法都可以
说,如果有一种方法可以用MS Excel来做,比如把矩阵项放在Excel文件中的单元格,并将其导入C++,并自动生成变量并赋值给它们,那么这将大大简化任务。在C++中,你可以使用一个向量,比如
std::vector<std::vector<int>> matrix;
现在你有了一个所有矩阵坐标的向量,其中你的条件是true
如果确实希望同时具有
true
和false
值,可以使用a和a,其中a包含矩阵坐标作为键,而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
的条目的映射。迭代此贴图以获得矩阵的坐标
当然,我可能完全误解了你的问题,在这种情况下,你当然可以忽略这个答案我知道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导入,如果以CSV格式保存Excel文件,则可以使用函数dlmread
在Matlab中读取。您也可以稍后尝试直接在Matlab中实现您的算法
最后,如果您想求解二进制整数程序,Matlab中已经有一个内置函数,名为bintprog
,可以为您求解
希望有帮助 Matlab似乎确实非常适合这项任务。尽管@Dr_Sam提供的示例确实会动态创建矩阵,但我建议您在分配值之前对其进行初始化。这样,如果工作区中已经存在同名的变量,并且变量始终具有预期的大小,那么代码仍然会得到正确的变量 假设您要定义一个方形8x8矩阵:
m = zeros(8)
现在,一般来说,如果您想要初始化一个大小为imax的三维矩阵,jmax
,kmax
:
imax = 8;
jmax = 8;
kmax = 5;
x = zeros(imax,jmax,kmax);
现在分配到这些矩阵或从中读取矩阵非常容易,请注意,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.
据我所知,您希望为每个
mij!=0
。如何定义这些x_ijk
?miy)x_ijk值不必定义。要么是0要么是1,这些值就是不等式组的解。谢谢你的建议。我需要单独变量的原因是,我需要使用这些变量来构建一组约束(方程和不等式)。我可以用std::vector做这个吗?如果这是个愚蠢的问题,我很抱歉。
imax = 8;
jmax = 8;
kmax = 5;
x = zeros(imax,jmax,kmax);
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.