Assign Wave By Index
JMurray
Works for numeric (real or complex) and text waves. See comments for description of the available modes (and the relative wave lengths between the source, destination, and index waves). Not tested for other wave lengths.
A special thanks goes to Fernando for his help with the "WaveMap" subroutine.
// AssignWave(SourceWave,DestWave,IndexWave,Mode)
// Quick wave assignment according to an index wave.
// Mode specifies how to interpret the index wave and assign values.
// Mode = 1: DestWave[i] = SourceWave[i]
// N(Source) = N(Dest) (IndexWave ignored - just pass a null reference)
// Mode = 2: DestWave[i] = SourceWave[IndexWave[i]]
// N(Source) = N(Dest) = N(Index)
// Mode = 3: DestWave[IndexWave[i]] = SourceWave[IndexWave[i]]
// N(Source) = N(Dest)
// Mode = 4: DestWave[IndexWave[i]] = SourceWave[i]
// N(Source) = N(Index)
//
// For Modes 1 and 2, IndexWave is the index into SourceWave.
// For Modes 3 and 4, IndexWave is the index into DestWave.
Function AssignWave(SourceWave,DestWave,IndexWave,Mode)
WAVE DestWave,SourceWave
WAVE IndexWave
Variable Mode
switch (Mode)
case 1: // Functional equivalent to DestWave[i] = SourceWave[i]
if (WaveType(DestWave,1)==2) // text wave; no MatrixOp support
DestWave = SourceWave
else // Faster than: DestWave = SourceWave[IndexWave]
if (WaveType(DestWave) & 0x01) // is complex?
FastOp/C DestWave = SourceWave
else
FastOp DestWave = SourceWave
endif
endif
break
case 2: // Functional equivalent to DestWave[i] = SourceWave[IndexWave[i]]
if (WaveType(DestWave,1)==2) // text wave; no MatrixOp support
DestWave = SourceWave[IndexWave]
else // Faster than: DestWave = SourceWave[IndexWave]
if (WaveType(DestWave) & 0x01) // is complex?
MatrixOp/O/C DestWave = waveMap(SourceWave,IndexWave)
else
MatrixOp/O DestWave = waveMap(SourceWave,IndexWave)
endif
endif
break
case 3: // Functional equivalent to DestWave[IndexWave[i]] = SourceWave[IndexWave[i]]
if (WaveType(DestWave,1)==2) // text wave
Make/T/O/N=(numpnts(IndexWave))/FREE DummyDestText
DummyDestText = AssignWave_WaveMapText(SourceWave,DestWave,IndexWave,IndexWave)
else // real or complex
Make/O/N=(numpnts(IndexWave))/FREE DummyDestNum
DummyDestNum = AssignWave_WaveMapNum(SourceWave,DestWave,IndexWave,IndexWave)
endif
break
case 4: // Functional equivalent to DestWave[IndexWave[i]] = SourceWave[i]
Make/O/N=(numpnts(SourceWave))/FREE SourceIndexWave = p
if (WaveType(DestWave,1)==2) // text wave
Make/T/O/N=(numpnts(IndexWave))/FREE DummyDestText
DummyDestText = AssignWave_WaveMapText(SourceWave,DestWave,SourceIndexWave,IndexWave)
else // real or complex
Make/O/N=(numpnts(IndexWave))/FREE DummyDestNum
DummyDestNum = AssignWave_WaveMapNum(SourceWave,DestWave,SourceIndexWave,IndexWave)
endif
break
endswitch
End
// Maps a source value into a destination value.
// Used by AssignWave (Modes 3 or 4). (For mode 3, srcidx = destidx)
// Suggested by Fernando on the Igor discussion list (7/20-21/12)
Function AssignWave_WaveMapNum(wSource, wDest, srcidx, destidx)
Wave/C wSource, wDest // complex, in general; also works for real
Variable srcidx,destidx
wDest[destidx] = wSource[srcidx]
End
Function/S AssignWave_WaveMapText(wSource, wDest, srcidx, destidx)
Wave/T wSource, wDest
Variable srcidx, destidx
wDest[destidx] = wSource[srcidx]
End
// Quick wave assignment according to an index wave.
// Mode specifies how to interpret the index wave and assign values.
// Mode = 1: DestWave[i] = SourceWave[i]
// N(Source) = N(Dest) (IndexWave ignored - just pass a null reference)
// Mode = 2: DestWave[i] = SourceWave[IndexWave[i]]
// N(Source) = N(Dest) = N(Index)
// Mode = 3: DestWave[IndexWave[i]] = SourceWave[IndexWave[i]]
// N(Source) = N(Dest)
// Mode = 4: DestWave[IndexWave[i]] = SourceWave[i]
// N(Source) = N(Index)
//
// For Modes 1 and 2, IndexWave is the index into SourceWave.
// For Modes 3 and 4, IndexWave is the index into DestWave.
Function AssignWave(SourceWave,DestWave,IndexWave,Mode)
WAVE DestWave,SourceWave
WAVE IndexWave
Variable Mode
switch (Mode)
case 1: // Functional equivalent to DestWave[i] = SourceWave[i]
if (WaveType(DestWave,1)==2) // text wave; no MatrixOp support
DestWave = SourceWave
else // Faster than: DestWave = SourceWave[IndexWave]
if (WaveType(DestWave) & 0x01) // is complex?
FastOp/C DestWave = SourceWave
else
FastOp DestWave = SourceWave
endif
endif
break
case 2: // Functional equivalent to DestWave[i] = SourceWave[IndexWave[i]]
if (WaveType(DestWave,1)==2) // text wave; no MatrixOp support
DestWave = SourceWave[IndexWave]
else // Faster than: DestWave = SourceWave[IndexWave]
if (WaveType(DestWave) & 0x01) // is complex?
MatrixOp/O/C DestWave = waveMap(SourceWave,IndexWave)
else
MatrixOp/O DestWave = waveMap(SourceWave,IndexWave)
endif
endif
break
case 3: // Functional equivalent to DestWave[IndexWave[i]] = SourceWave[IndexWave[i]]
if (WaveType(DestWave,1)==2) // text wave
Make/T/O/N=(numpnts(IndexWave))/FREE DummyDestText
DummyDestText = AssignWave_WaveMapText(SourceWave,DestWave,IndexWave,IndexWave)
else // real or complex
Make/O/N=(numpnts(IndexWave))/FREE DummyDestNum
DummyDestNum = AssignWave_WaveMapNum(SourceWave,DestWave,IndexWave,IndexWave)
endif
break
case 4: // Functional equivalent to DestWave[IndexWave[i]] = SourceWave[i]
Make/O/N=(numpnts(SourceWave))/FREE SourceIndexWave = p
if (WaveType(DestWave,1)==2) // text wave
Make/T/O/N=(numpnts(IndexWave))/FREE DummyDestText
DummyDestText = AssignWave_WaveMapText(SourceWave,DestWave,SourceIndexWave,IndexWave)
else // real or complex
Make/O/N=(numpnts(IndexWave))/FREE DummyDestNum
DummyDestNum = AssignWave_WaveMapNum(SourceWave,DestWave,SourceIndexWave,IndexWave)
endif
break
endswitch
End
// Maps a source value into a destination value.
// Used by AssignWave (Modes 3 or 4). (For mode 3, srcidx = destidx)
// Suggested by Fernando on the Igor discussion list (7/20-21/12)
Function AssignWave_WaveMapNum(wSource, wDest, srcidx, destidx)
Wave/C wSource, wDest // complex, in general; also works for real
Variable srcidx,destidx
wDest[destidx] = wSource[srcidx]
End
Function/S AssignWave_WaveMapText(wSource, wDest, srcidx, destidx)
Wave/T wSource, wDest
Variable srcidx, destidx
wDest[destidx] = wSource[srcidx]
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More