Re: creating adjacency matrices
- To: mathgroup at smc.vnet.net
- Subject: [mg36593] Re: [mg36561] creating adjacency matrices
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Fri, 13 Sep 2002 01:14:16 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
One can make my original code (below) much faster by adding an auxiliary function and using "dynamic programming": In[1]:= ss=ReadList["adj.txt",{Number,Word}] Out[1]= {{1,A},{1,B},{2,B},{3,C},{4,B},{5,D},{5,E},{6,F},{7,A}} In[2]:= l=Length[Union[First[Transpose[ss]]]] Out[2]= 7 a[i_] := a[i] = Cases[ss, {i, x_} -> x, {1}] In[4]:= Table[If[Intersection[a[i],a[j]]=!={},1,0](1- KroneckerDelta[i,j]),{i,l},{j, l}]//MatrixForm Out[4]//MatrixForm= 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 For large lists you will see a large difference in speed. Andrzej Kozlowski Toyama International University JAPAN On Friday, September 13, 2002, at 01:48 am, Andrzej Kozlowski wrote: > First of all, Import is not really meant for this sort of situation; > it is better to use ReadList. Suppose your file is: > > 1 A > 1 B > 2 B > 3 C > 4 B > 5 D > 5 E > 6 F > 7 A > > and its name is "adj.txt". Here is one way you can deal with this > case. First, read in the file: > > > In[1]:= > ss=ReadList["adj.txt",{Number,Word}] > > Out[1]= > {{1,A},{1,B},{2,B},{3,C},{4,B},{5,D},{5,E},{6,F},{7,A}} > > Next, find how many "actors" there are: > > In[2]:= > l=Length[Union[First[Transpose[ss]]]] > > Out[2]= > 7 > > Construct the adjacency matrix: > > In[3]:= > Table[If[Intersection[Cases[ss,{i,x_}->x,{1}], > > Cases[ss,{j,x_}->x,{1}]]=!={},1,0](1-KroneckerDelta[i,j]),{i, > l},{j,l}]//MatrixForm > > Out[3]//MatrixForm= > 0 1 0 1 0 0 1 > > 1 0 0 1 0 0 0 > > 0 0 0 0 0 0 0 > > 1 1 0 0 0 0 0 > > 0 0 0 0 0 0 0 > > 0 0 0 0 0 0 0 > > 1 0 0 0 0 0 0 > > The function ToAdjacencyMatrix form the Combinatorica package > constructs the adjacency matrix from a graph, so it has no direct > application to your problem. > > Andrzej Kozlowski > Toyama International University > JAPAN > > > > > On Thursday, September 12, 2002, at 02:27 am, Moliterno, Thomas wrote: > >> I need to create an adjacency matrix from my data, which is currently >> in >> the form of a .txt file and is basically a two column incidence list. >> For example: >> >> 1 A >> 1 B >> 2 B >> 3 C >> . . >> . . >> . . >> m n >> >> Where 1 to m represent actors and A to n represent events. My goal is >> to >> have an (m x m) matrix where cell i,j equals 1 if two actors are >> incident to the same event (in the sample above, 1 and 2 are both >> incident to B) and 0 otherwise (w/ zeros on the diagonal). >> >> I'm new to Mathmatica, and so I'm on the steep part of the learning >> curve ... All I've been able to figure out so far is how to get my >> incidence list into the program using Import["filename.txt"]. But then >> what? How do I convert to the adjacency matrix? I've found the >> ToAdjacencyMatrix[] command in DiscreteMath`Combinatorica`, but I >> can't >> seem to get it to work ... >> >> Thanks to any and all in advance. >> >> Tom >> >> ********************************************** >> Thomas P. Moliterno >> Graduate School of Management >> University of California, Irvine >> tmoliter at uci.edu >> ********************************************** >> >> >> > >