Identify Point in Matrix Subrange
hrodstein
Make/O/N=(5,5) mat = p + 10*q
Display mat[][2] // Display all rows of column 2
Display mat[][2] // Display all rows of column 2
In the case of a 2D wave, the Y coordinates for a trace can come from any of the following:
Display mat[][2] // All rows of one column
Display mat[1,3][2] // Range of rows of one column
Display mat[0,4;2][2] // Range of rows of one column with increment
Display mat[2][] // All columns of one row
Display mat[2][1,3] // Range of columns of one row
Display mat[2][0,4;2] // Range of columns of one row with increment
Display mat[1,3][2] // Range of rows of one column
Display mat[0,4;2][2] // Range of rows of one column with increment
Display mat[2][] // All columns of one row
Display mat[2][1,3] // Range of columns of one row
Display mat[2][0,4;2] // Range of columns of one row with increment
The X coordinates for a trace can come from any of the above or, in the case of a waveform display, are calculated from the 2D wave's row or column scaling.
The attached experiment demonstrates how to determine the row and column indices of a data point of a subrange display using the included GetMatrixTraceIndices function.
Here is the function itself:
// GetMatrixTraceIndices(graphName, traceName, dataIndex, wantY, matrixRow, matrixColumn)
//
// traceName is the name of a trace whose X or Y coordinates come from a (matrix) 2D wave.
//
// dataIndex is the row index (when displaying a column of a matrix) or the column index
// (when displaying a column of a matrix) of the matrix element supplying the data
// for a point in the trace. This is the value returned by pcsr(<cursor>) when the
// specified <cursor> is on the an element of the trace.
//
// Returns via matrixRow and matrixColumn the indices of the specified point in the matrix.
//
// The function result is zero if everything went right or non-zero in the event of an error.
//
// Calling this when the trace in question does not come from a matrix returns -1.
// See demo below.
Function GetMatrixTraceIndices(graphName, traceName, dataIndex, wantY, matrixRow, matrixColumn)
String graphName // Graph name or "" for top graph
String traceName // Trace name, e.g. "mat" or "mat#1"
Variable wantY // 0 to get indices for X coordinate, 1 to get indices for Y coordinate
Variable dataIndex // See explanation above
Variable& matrixRow // Output
Variable& matrixColumn // Output
String info = TraceInfo(graphName, traceName, 0)
if (strlen(info) == 0)
return -1 // No such trace
endif
Variable isXY = WaveExists(XWaveRefFromTrace(graphName, traceName))
if (wantY==0 && !isXY)
wantY = 1 // This is a waveform plot so X values come from Y wave
endif
String rangeStr
if (wantY)
Wave w = TraceNameToWaveRef(graphName, traceName)
rangeStr = StringByKey("YRANGE", info)
else
Wave w = XWaveRefFromTrace(graphName, traceName)
rangeStr = StringByKey("XRANGE", info)
endif
if (WaveDims(w) != 2)
return -1 // Not a matrix
endif
String rowStr, columnStr, temp
String regExp = "(\[)(.*)(\])(\[)(.*)(\])"
SplitString /E=regExp rangeStr, temp, rowStr, temp, temp, columnStr, temp
// Print rowStr, columnStr // For debugging
Variable displayingColumn = 1 // True if trace data comes from matrix column, not matrix row
if (CmpStr(columnStr,"*") == 0)
displayingColumn = 0 // e.g., Display mat[2][*] // Display all columns of row 2
endif
if (strsearch(columnStr,",",0) >= 0)
displayingColumn = 0 // e.g., Display mat[2][1,3] // Display columns 1 to 3 of row 2
endif
if (displayingColumn)
// mat[*][<column>], mat[<firstRow>,<lastRow>][<column>] or mat[<firstRow>,<lastRow>;<increment>][<column>]
matrixRow = dataIndex
matrixColumn = str2num(columnStr)
else // !displayingColumn
// mat[<row>][*], mat[<row>][<firstColumn>,<lastColumn>] or mat[<row>][<firstColumn>,<lastColumn>;<increment>]
matrixRow = str2num(rowStr)
matrixColumn = dataIndex
endif
return 0
End
//
// traceName is the name of a trace whose X or Y coordinates come from a (matrix) 2D wave.
//
// dataIndex is the row index (when displaying a column of a matrix) or the column index
// (when displaying a column of a matrix) of the matrix element supplying the data
// for a point in the trace. This is the value returned by pcsr(<cursor>) when the
// specified <cursor> is on the an element of the trace.
//
// Returns via matrixRow and matrixColumn the indices of the specified point in the matrix.
//
// The function result is zero if everything went right or non-zero in the event of an error.
//
// Calling this when the trace in question does not come from a matrix returns -1.
// See demo below.
Function GetMatrixTraceIndices(graphName, traceName, dataIndex, wantY, matrixRow, matrixColumn)
String graphName // Graph name or "" for top graph
String traceName // Trace name, e.g. "mat" or "mat#1"
Variable wantY // 0 to get indices for X coordinate, 1 to get indices for Y coordinate
Variable dataIndex // See explanation above
Variable& matrixRow // Output
Variable& matrixColumn // Output
String info = TraceInfo(graphName, traceName, 0)
if (strlen(info) == 0)
return -1 // No such trace
endif
Variable isXY = WaveExists(XWaveRefFromTrace(graphName, traceName))
if (wantY==0 && !isXY)
wantY = 1 // This is a waveform plot so X values come from Y wave
endif
String rangeStr
if (wantY)
Wave w = TraceNameToWaveRef(graphName, traceName)
rangeStr = StringByKey("YRANGE", info)
else
Wave w = XWaveRefFromTrace(graphName, traceName)
rangeStr = StringByKey("XRANGE", info)
endif
if (WaveDims(w) != 2)
return -1 // Not a matrix
endif
String rowStr, columnStr, temp
String regExp = "(\[)(.*)(\])(\[)(.*)(\])"
SplitString /E=regExp rangeStr, temp, rowStr, temp, temp, columnStr, temp
// Print rowStr, columnStr // For debugging
Variable displayingColumn = 1 // True if trace data comes from matrix column, not matrix row
if (CmpStr(columnStr,"*") == 0)
displayingColumn = 0 // e.g., Display mat[2][*] // Display all columns of row 2
endif
if (strsearch(columnStr,",",0) >= 0)
displayingColumn = 0 // e.g., Display mat[2][1,3] // Display columns 1 to 3 of row 2
endif
if (displayingColumn)
// mat[*][<column>], mat[<firstRow>,<lastRow>][<column>] or mat[<firstRow>,<lastRow>;<increment>][<column>]
matrixRow = dataIndex
matrixColumn = str2num(columnStr)
else // !displayingColumn
// mat[<row>][*], mat[<row>][<firstColumn>,<lastColumn>] or mat[<row>][<firstColumn>,<lastColumn>;<increment>]
matrixRow = str2num(rowStr)
matrixColumn = dataIndex
endif
return 0
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More