如何自动生成和分配与矩阵中元素相对应的变量
How to auto-generate and assign variables corresponding to elements in a 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* 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)
一般来说,如果要初始化大小为imax
、jmax
、kmax
:的三维矩阵
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;
你不需要为矩阵值使用单独的变量,当你有矩阵时,为什么要这样做?
我不明白为什么需要在评估true
或false
时获得所有值。相反,只需将条件评估为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
。
如果您真的想同时使用true
和false
值,可以使用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;
在此映射中插入矩阵中的所有值,以矩阵的坐标为键,映射值为true
或false
,具体取决于您的条件。
要从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
可以为你求解。
希望它能有所帮助!
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何相对于其他元素过滤矢量元素
- 如何自动生成和分配与矩阵中元素相对应的变量