X
PrevPrev Go to previous topic
NextNext Go to next topic
Last Post 18 Jun 2008 11:40 AM by  anon
plotting common values of separate arrays
 1 Replies
Sort:
You are not authorized to post a reply.
Author Messages

anon



New Member


Posts:
New Member


--
18 Jun 2008 11:40 AM
    Hello, I am fairly new to IDL and am working on a program to create timeseries comparisons of solar data. One of my tasks is to add a comparison between common days between different sets of data. Does anyone have an idea on how I might do this? For example, my date arrays have the form: dat1[x, *] and dat2[y, *] where x and y are the columns which contain the date information. The data sets range over different, but overlapping periods and different frequencies. Thanks in advance. Ryan Courreges

    Deleted User



    New Member


    Posts:
    New Member


    --
    18 Jun 2008 11:40 AM
    You are looking for what I would refer to as a "set intersection". The founder of IDL, David Stern, once made a very efficient library of three functions useful for set math. I am too lazy to edit right now, so I paste the fully 'idldoc'umented code at the bottom of this Email. Provided that your time values are integers, i,e. whole Julian days, not Julian doubles that contain hour/minute/second information, I think you could run the following with David Stern's library: dat1days = long( dat1[dat1TimeColumnNo, *] ) dat2days = long( dat2[dat2TimeColumnNo, *] ) ; Unfortunately, the below does not return subscripts. Rather, it returns ; a non-redundant set of dates that are shared by both 'dat1' and 'dat2' sharedDates = SetIntersection(dat1days, dat2days) ; The below code assumes that there is no two rows in a single ; data set share the same date. The below would have to be modified ; if that were not true. nSharedDates = n_elements(sharedDates) relevantSubscripts1 = lonarr(nSharedDates) relevantSubscripts2 = lonarr(nSharedDates) ; There is for sure a way using HISTOGRAM to avoid this ; FOR loop, but I wouldn't bother to work that out, if the ; below WHERE loop is not too time-consuming. for i = 0, nSharedDates-1 do begin relevantSubscripts1[i] = where(dat1days eq sharedDates[i]) relevantSubscripts2[i] = where(dat2days eq sharedDates[i]) endfor relevantData1 = dat1[*, relevantSubscripts1] relevantData2 = dat2[*, relevantSubscripts2]OK, here, then, is the Dave Stern library with a demonstration function at the very end. Hopefully, you can copy and paste that into the IDL Workbench (or a text editor) and save it as 'set_math_operator_lib.pro': ;+ ; ; Provides the set union of two positive integer vectors. Duplicates ; are removed from this union. ; ; @File_Comments ; Functions from RSI (now ITT VIS) founder David Stern that perform the ; "set operations" UNION, INTERSECTION and DIFFERENCE on positive integer ; input arguments. These use IDL's HISTOGRAM function for maximum ; speed and efficiency, if the data range is not overly wide. The ; specific procedure SET_MATH_OPERATOR_LIBRARY is simply a procedure ; that demonstrates the three set operator functions contained here. ; *** WARNING *** These functions will not be efficient on sparse sets ; with wide ranges, as they trade memory for efficiency. The HISTOGRAM ; function is used, which creates arrays of size equal to the range of ; the resulting set. ; ; @Param ; intVectorA {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Param ; intVectorB {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Author ; IDL Founder David Stern ; ; @Examples ; Run IDL> SET_MATH_OPERATOR_LIBRARY to demonstrate ; ; @History ; Created August 29, 1997 ; ; @Returns ; A positive integer array of same datatype as highest-precedent input arg ;- FUNCTION SetUnion, intVectorA, intVectorB if intVectorA[0] lt 0 then return, intVectorB ;A union NULL = A if intVectorB[0] lt 0 then return, intVectorA ;B union NULL = B ; Return combined set return, where(histogram([intVectorA,intVectorB], OMIN = omin)) + omin end ;+ ; ; Provides the set intersection of two positive integer vectors ; ; @Param ; intVectorA {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Param ; intVectorB {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Author ; IDL Founder David Stern ; ; @Examples ; Run IDL> SET_MATH_OPERATOR_LIBRARY to demonstrate ; ; @History ; Created August 29, 1997 ; ; @Returns ; A positive integer array of same datatype as highest-precedent input arg ; *** OR *** scalar -1 if the intersection is empty (i.e. a "null set") ;- FUNCTION SetIntersection, intVectorA, intVectorB minab = min(intVectorA, MAX=maxa) > min(intVectorB, MAX=maxb) ;Only need intersection of ranges maxab = maxa ; Finds members of set A that are not in set B ; ; @Param ; intVectorA {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Param ; intVectorB {in} {required} {type=vector of positive integers} ; A set of positive integers ; ; @Author ; IDL Founder David Stern ; ; @Examples ; Run IDL> SET_MATH_OPERATOR_LIBRARY to demonstrate ; ; @History ; Created August 29, 1997 ; ; @Returns ; A positive integer array of same datatype as highest-precedent input arg ; *** OR *** scalar -1 if there is no difference between the two inputs. ;- FUNCTION SetDifference, intVectorA, intVectorB ; = a and (not b) = elements in A but not in B mina = min(intVectorA, MAX=maxa) minb = min(intVectorB, MAX=maxb) if (minb gt maxa) or (maxb lt mina) then return, intVectorA ;No intersection... r = where((histogram(intVectorA, MIN=mina, MAX=maxa) ne 0) and $ (histogram(intVectorB, MIN=mina, MAX=maxa) eq 0), count) if count eq 0 then return, -1 else return, r + mina end ;+ ; ; A simple test driver to demonstrate David Stern's three set operator ; functions ; ; @Author ; James Jones (jjayjones\@comcast.net) ; ; @History ; Created June 9, 2008 ;- PRO set_math_operator_library intVectorA = [2,4,6,8] intVectorB = [6,1,3,2] print, intVectorA, FORMAT='("Set A = {", 4I3, " }")' print, intVectorB, FORMAT='("Set B = {", 4I3, " }")' commonElements = SetIntersection(intVectorA, intVectorB) ; [2,6] print, commonElements, FORMAT='("Intersection of sets = {", ' + $ strtrim(n_elements(commonElements), 2) + 'I3, " }")' nonredundantUnitedElements = SetUnion(intVectorA, intVectorB) ; [1,2,3,4,6,8] print, nonredundantUnitedElements, FORMAT='("Union of sets = {", ' + $ strtrim(n_elements(nonredundantUnitedElements), 2) + 'I3, " }" )' uniqueInA = SetDifference(intVectorA, intVectorB) ; [4, 8] print, uniqueInA, FORMAT='("Elements in A but not in B = {", ' + $ strtrim(n_elements(uniqueInA), 2) + 'I3, " }" )' print, 'Testing intersection of A with { 3 5 7 }' print, SetIntersection(intVectorA,[3,5,7]) ; = -1, indicator for null set ENDJames Jones
    You are not authorized to post a reply.