用c++ Matlab Data API创建稀疏数组

5次浏览(过去30天)
kameranis
kameranis 2021年6月28日
回答: kameranis2021年6月28日
我已经按照指示做了 在这里 创建稀疏双数组。我没有像在调试器中那样返回,而是从调试器中得到以下消息
线程40“MATLAB”接收信号SIGINT,中断。
[切换到线程0x7fffdfe48700 (LWP 14917)]
0 x00007ffff68c2cb9__gi__ poll (fds=0x7fffda7c6e40, nfds=2, timeout=1000) at ../sysdeps/unix/sysv/linux/poll.c:29
29 ../sysdeps/unix/sysv/linux/poll.c: No such文件或目录。
看看其他答案,似乎这应该发生在指针被统一时,但我找不到它可能是什么指针,因为我复制了官方文档。
这是代码。它的目标是读取图表。每一行的第一个数字是该节点的权值,其余是该节点的边及其权值。
/* 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;
};
顶部的函数是读取文件,并将三位一体放在头,尾和权重中,然后在运算符函数中,它将结果发送回Matlab。下面是一个小的示例文件,它应该能够阅读:
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
编译:
墨西哥人COPTIMFLAGS="-Wall -Wextra" loadMetisGraph.cpp -g .
调用命令:
[G, weights] = loadMetisGraph(“karate.metis”);
如果有人能给我指出正确的方向,我会很感激。

接受的答案

kameranis
kameranis 2021年6月28日
找到了问题所在。
一) 节点 应该是 size_t
b)读入 size_t 并将需要的转换为 总比反过来好。
c)因为我没有增加 节点 在同一个位置有很多条目,这需要很多时间来聚合,而我认为它是挂着的。

更多答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!