# Calculate the intersection (and difference) of two 1D text waves

//**
// Calculates the intersection of two 1D text waves.
//
// @param wave1
//  First 1D text wave.
// @param wave2
//  Second 1D text wave.
// @param resultWave
//  A text wave where the result will be stored.  This wave will be overwritten if it already contains
//  any data.
// @param rejectWave
//  [OPTIONAL]  A text wave where all values that are in the shorter of wave1 and wave 2 but
//  not in the longer are stored.  Providing this parameter allows you to determine both which
//  values are present in both waves and which are not.  NOTE:  rejectWave will NOT contain
//  values that are present in the longer of the two waves but not in the shorter.
//*
Function CalculateTextWaveIntersection(wave1, wave2, resultWave, [rejectWave])
WAVE/T wave1
WAVE/T wave2
WAVE/T resultWave
WAVE/T rejectWave

Variable processRejects
if (ParamIsDefault(rejectWave))
processRejects = 0
else
processRejects = 1
endif

Variable wave1Rows = DimSize(wave1, 0)
Variable wave2Rows = DimSize(wave2, 0)
Variable longRows, shortRows
if (wave1Rows > wave2Rows)
Duplicate/O/T wave1, longWave
WAVE/T shortWave = wave2
longRows = wave1Rows
shortRows = wave2Rows
else
Duplicate/O/T wave2, longWave
WAVE/T shortWave = wave1
longRows = wave2Rows
shortRows = wave1Rows
endif

// Sort values in longWave
Sort longWave, longWave
Redimension/N=(0) resultWave

Variable n, numOutRows, longWaveRow, rejectRows
For (n=0; n<shortRows; n+=1)
FindValue/TEXT=shortWave[n]/TXOP=4 longWave
longWaveRow = V_Value
if ((longWaveRow) >= 0 && cmpstr(longWave[longWaveRow], shortWave[n]) == 0)
Redimension/N=(numOutRows + 1) resultWave
resultWave[numOutRows] = shortWave[n]
numOutRows += 1
elseif (processRejects)
rejectRows = DimSize(rejectWave, 0)
Redimension/N=(rejectRows + 1) rejectWave
rejectWave[rejectRows] = shortWave[n]
endif
EndFor
KillWaves/Z longWave
End Forum Support Gallery