gpt4 book ai didi

c++ - 如何在 Igraph + C 中保留节点的位置和名称

转载 作者:行者123 更新时间:2023-11-30 18:00:37 28 4
gpt4 key购买 nike

考虑到How to keep position of nodes in igraph + R ,我有四个顶点 id(0,1,2,3)、名称(1,2,3,4) 和位置(0,0, 0,1, 1,1, 1,0) 的图,对于一个简单的例子,我想消除顶点 id(1),并保留其他人的职位和姓名。下一个代码说明了调试它的绘图实现。我必须做几次消除,同时保留其他顶点的位置和名称,如何在 C 中做到这一点?

#include <igraph.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>

#include <vector>
#include <algorithm>
#include <map>
#include <set>

using namespace std;


void plot(igraph_t g) {
FILE *ofile;
ofile=fopen("test.txt", "w+");
igraph_write_graph_edgelist(&g,ofile);
fclose (ofile);

ofstream gp("data.R");
gp << "library(igraph)"<<endl;
gp << "library(Cairo)"<<endl;
gp << "g1 <-read.table(\"test.txt\")"<< endl;
gp << "g1 <- t(as.matrix(g1))"<< endl;
gp << "g<-graph(g1,n=4,dir=FALSE)"<< endl;
gp << "V(g)$name<-c(1:4)"<< endl;
gp << "V(g)$label<-V(g)$name"<< endl;
gp << "V(g)$id<-c(0:3)"<< endl;
gp << "coords <- c(0,0,0,1,1,1,1,0)"<< endl;
gp << "coords <- matrix(coords, 4,2,byrow=T)"<< endl;
gp << "plot(g,layout=coords[V(g)$name,])"<< endl;
gp.close();

system("R CMD BATCH data.R");
}


int main() {


igraph_t g;
igraph_vector_t v;


igraph_vector_init(&v,8);
VECTOR(v)[0]=0; VECTOR(v)[1]=1;
VECTOR(v)[2]=1; VECTOR(v)[3]=2;
VECTOR(v)[4]=2; VECTOR(v)[5]=3;
VECTOR(v)[6]=3; VECTOR(v)[7]=0;

igraph_create(&g, &v, 0,0);

//plot(g);

igraph_delete_vertices(&g,igraph_vss_1(1));

plot(g);


igraph_destroy(&g);
igraph_vector_destroy(&v);

return 0;
}

根据第 9 章编辑程序。图、顶点和边属性(Tamás):

我编辑了程序,现在我保留了名称,但是如何获取这些顶点名称的函数中的边,然后将它们写入 igraph_write_graph_edgelist(&g,ofile) 中?

#include <igraph.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>

#include <vector>
#include <algorithm>
#include <map>
#include <set>

#include <string.h>
#include <stdlib.h>

using namespace std;

void plot(igraph_t g) {
FILE *ofile;
ofile=fopen("test.txt", "w+");
igraph_write_graph_edgelist(&g,ofile);
fclose (ofile);

ofstream gp("data.R");
gp << "library(igraph)"<<endl;
gp << "library(Cairo)"<<endl;
gp << "g1 <-read.table(\"test.txt\")"<< endl;
gp << "g1 <- t(as.matrix(g1))"<< endl;
gp << "g<-graph(g1,n=4,dir=FALSE)"<< endl;
gp << "V(g)$name<-c(1:4)"<< endl;
gp << "V(g)$label<-V(g)$name"<< endl;
gp << "V(g)$id<-c(0:3)"<< endl;
gp << "coords <- c(0,0,0,1,1,1,1,0)"<< endl;
gp << "coords <- matrix(coords, 4,2,byrow=T)"<< endl;
gp << "plot(g,layout=coords[V(g)$name,])"<< endl;
gp.close();

system("R CMD BATCH data.R");
}


int main() {
igraph_i_set_attribute_table(&igraph_cattribute_table);

igraph_t g;
igraph_vector_t v;


igraph_strvector_t vnames1,vnames2;





igraph_vector_init(&v,8);
VECTOR(v)[0]=0; VECTOR(v)[1]=1;
VECTOR(v)[2]=1; VECTOR(v)[3]=2;
VECTOR(v)[4]=2; VECTOR(v)[5]=3;
VECTOR(v)[6]=3; VECTOR(v)[7]=0;

igraph_create(&g, &v, 0,0);


igraph_strvector_init(&vnames1, 0);
igraph_strvector_init(&vnames2, 0);


SETVAS(&g, "name", 0, "1");
SETVAS(&g, "name", 1, "2");
SETVAS(&g, "name", 2, "3");
SETVAS(&g, "name", 3, "4");



//plot(g);



igraph_delete_vertices(&g,igraph_vss_1(1));
plot(g);

VASV(&g,"name",&vnames2);

long int i;
for (i=0; i<igraph_strvector_size(&vnames2); i++) {
printf("%s ", STR(vnames2, i));
}

igraph_destroy(&g);
igraph_vector_destroy(&v);

return 0;
}

提前致谢

休假

最佳答案

使用顶点属性将名称和任何相关信息附加到节点;即使删除后,这些也会保留。

请参阅文档的相关部分:Chapter 9. Graph, Vertex and Edge Attributes

关于c++ - 如何在 Igraph + C 中保留节点的位置和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320068/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com