/* c matlab功能:loadmetisgraph
用途:读入按照手册中的描述创建METIS文件
(http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf)
而且返回文件中指定的图和节点权重
用法:函数[G, weights] = loadmetsgraph(graphFilename);
输入:
-graphFilename (char):路径图形文件
输出:
-G(稀疏矩阵):A稀疏所读图形的表示
待办事项:能够读取所有METIS格式
* /
#包括< iostream >
#包括< fstream >
#迭代器包括< >
#包括< sstream >
#包括<字符串>
#包括向量> <
#包括“mex.hpp”
#包括“mexAdapter.hpp”
#包括“MatlabDataArray.hpp”
无效loadMetisGraph(std::string graphFilename, size_t &n, size_t &m, std::vector &heads, std::vector &tails, std::vector &weights, std::vector &nodeWeights) {
int64_tFlag = 0;
std:: ifstream graphFile (graphFilename);
如果(! graphFile.is_open ()) {
std:: cerr < <"无法打开graphFilename "<< graphFilename <<”。检查路径和权限。\n";
返回;
}
N = 0;
M = 0;
std:: string行;
int64_t节点= 0;
而(std::getline(graphFile, line)) {
std:: istringstream iss{线};
//定义变量“数据”。使用范围构造函数和流迭代器
Std::vector data{Std::istream_iterator(iss), Std::istream_iterator()};
如果(n = 0) {
N =数据[0];
M =数据[1];
如果(data.size() > 2)
Flag = data[2];
继续;
}
nodeWeights.push_back(数据[0]);
为(size_t j = 1;J < data.size();J += 2) {
正面。Push_back (data[j] - 1);
tails.push_back(节点);
权重。Push_back (data[j + 1]);
}
}
}
类MexFunction: public matlab::mex::Function
{
std::shared_ptr matlabPtr = getEngine();
matlab::数据::ArrayFactory工厂;
公众:
void operator()(matlab::mex::ArgumentList输出,matlab::mex::ArgumentList输入)
{
size_t n;
size_t m;
std::向量< size_t >头;
std::向量< size_t >反面;
std::向量<二>权重;
<二> std::向量nodeWeights;
std:: string graphFilename (matlab::数据::CharArray(输入[0]).toAscii ());
loadMetisGraph(graphFilename, n, m,头,尾,权重,nodeWeights);
auto nodeWeightsArr = factory。createArray({1, n}, nodeWeights.begin(), nodeWeights.end()));
Matlab::data::buffer_ptr_t heads_p = factory。createBuffer(2 * m);
Matlab::data::buffer_ptr_t tails_p = factory。createBuffer(2 * m);
Matlab::data::buffer_ptr_t weights_p = factory。createBuffer(2 * m);
size_t *headsPtr = heads_p.get();
size_t *tailsPtr = tails_p.get();
double *weightsPtr = weights_p.get();
std::cerr << headsPtr << std::endl;
std:: cerr < <"n = "<< n <<" M = "<< m <<" 2m = "<< 2 * m <<“重量。Size = "<< weights.size() << std::endl;
std:: for_each (heads.begin (), heads.end (), [&] (const size_t e) {* (headsPtr + +) = e;});
std:: for_each (tails.begin (), tails.end (), [&] (const size_t e) {* (tailsPtr + +) = e;});
std::for_each(weights.begin(), weights.end(), [&](const double& e) {*(weightsPtr++) = e;});
//使用缓冲区来创建稀疏数组
matlab::data::SparseArray G =
工厂。createSparseArray({n, n}, 2 * m,
std::移动(weights_p), std::移动(tails_p), std::移动(heads_p));
输出[0]= G;
输出[1]= nodeWeightsArr;
}
};
34 78 011
16 2 13 14 1 5 16 1 7 18 1 9 1 11 1 12 1 13 1 14 1 18 1 20 1 22 1 32 1
9 1 1 31 4 18 1 14 1 18 1 20 1 22 1 31 1
10 1 1 2 14 1 8 1 9 1 10 1 14 1 28 1 29 1 33 1
6 1 1 2 13 1 8 1 13 1 14 1
3 11 7 1 11 1
4 11 7 1 11 1 17 1
4 1 1 5 1 6 1 17
4 1 1 2 1 3 1 4
5 1 1 31 31 1 33 1 34 1
2 3 1 34
3 1 1 5 1 6 1
1 1 1
2 1 1 4 1
5 1 1 2 1 3 1 4 1 34
2 33 1 34 1
2 33 1 34 1
2 6 1 7
2 1 1 2 1
2 33 1 34 1
3 1 1 2 1 34
2 33 1 34 1
2 1 1 2 1
2 33 1 34 1
5 28 1 33 1 34 1 26 1 30 1
3 32 1 28 1 26 1
3 32 1 24 1 25 1
2 34 1 30
4 3 1 24 1 25 1 34 1
3 3 1 32 1 34 1
4 33 1 34 1 24 1 27 1
4 2 1 9 1 33 1 34 1
6 1 1 25 1 26 1 29 1 33 1 34 1
12 31 9 1 32 1 31 1 15 1 16 1 19 1 21 1 23 1 24 1 30 1 34 1
17 9 1 14 1 20 1 32 1 31 1 10 1 28 1 29 1 33 1 15 1 16 1 19 1 21 1 23 1 24 1 27 1 30 1