假设SNN是如下图表示的网络
很容易得出他的边列表
0 1
1 3
3 5
5 6
6 3
3 4
4 6
0 2
2 1
将数据保存为graph.txt。然后读取代码保存为邻接表,则代代码为
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
std::vector<std::vector<int>> readFromText(const std::string& filename) {
std::ifstream inputFile(filename);
if (!inputFile) {
std::cerr << "打开失败!!!" << std::endl;
return {};
}
std::vector<std::vector<int>> adjacencyList; // 邻接表
std::string line;
while (std::getline(inputFile, line)) {
std::istringstream iss(line); //从输入流读取数据。
int startVertex, endVertex;
while (iss >> startVertex >> endVertex) {
// 这段代码是为了保证邻接表的大小始终为节点的个数
int maxVertex = std::max(startVertex, endVertex);
if (adjacencyList.size() < maxVertex + 1) {
adjacencyList.resize(maxVertex + 1);
}
// 根据边的起始顶点和结束顶点构建邻接表
adjacencyList[startVertex].push_back(endVertex);
}
}
inputFile.close();
return adjacencyList;
}
int main() {
std::string filename = ".\\graph.txt";
std::vector<std::vector<int>> adjacencyList = readFromText(filename);
std::cout << "图的邻接表存储格式为:" << std::endl;
for (int i = 0; i < adjacencyList.size(); ++i) {
std::cout << "Vertex " << i << ": ";
for (int j = 0; j < adjacencyList[i].size(); ++j) {
std::cout << adjacencyList[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
执行结果为
再将邻接表转换成一个CSR存储的稀疏矩阵。代码为
void convertToCSR(const std::vector<std::vector<int>>& adjacencyList,
std::vector<int>& xadj, std::vector<int>& adjncy)
{
int numVertices = adjacencyList.size();
int numEdges = 0;
// 计算总边数
for (const auto& neighbors : adjacencyList) {
numEdges += neighbors.size();
}
// 分配空间
xadj.resize(numVertices + 1);
adjncy.resize(numEdges);
int index = 0;
for (int vertex = 0; vertex < numVertices; ++vertex) {
xadj[vertex] = index;
for (int neighbor : adjacencyList[vertex]) {
adjncy[index] = neighbor;
++index;
}
}
xadj[numVertices] = numEdges;
}
打印结果
这项工作主要是对以后存在的SNN网络的拓扑结构的探讨,对于SNN网络来说,大部分的拓扑结构都是稀疏性,所以我们不可能使用邻接矩阵的方式存储,因为假设模拟1000个神经元,这开销太大,不能接受。相反采用邻接表或者CSR的格式,可以节省内部空间。