关于图的存储方式的一些转换

 假设SNN是如下图表示的网络

关于图的存储方式的一些转换_第1张图片

 很容易得出他的边列表

0 1
1 3
3 5
5 6
6 3
3 4
4 6
0 2
2 1

 将数据保存为graph.txt。然后读取代码保存为邻接表,则代代码为

#include 
#include 
#include 
#include 

std::vector> readFromText(const std::string& filename) {
    std::ifstream inputFile(filename);
    if (!inputFile) {
        std::cerr << "打开失败!!!" << std::endl;
        return {};
    }

    std::vector> 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> 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;
}

执行结果为

关于图的存储方式的一些转换_第2张图片

再将邻接表转换成一个CSR存储的稀疏矩阵。代码为

void convertToCSR(const std::vector>& adjacencyList,
    std::vector& xadj, std::vector& 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;
}

 打印结果

关于图的存储方式的一些转换_第3张图片

 这项工作主要是对以后存在的SNN网络的拓扑结构的探讨,对于SNN网络来说,大部分的拓扑结构都是稀疏性,所以我们不可能使用邻接矩阵的方式存储,因为假设模拟1000个神经元,这开销太大,不能接受。相反采用邻接表或者CSR的格式,可以节省内部空间。

你可能感兴趣的:(分布式模拟脉冲神经网络,c++,算法,开发语言)