Delete rows or columns of a 2D wave (DimLabel aware)
ChrLie
Snippet to delete rows or columns of a 2D wave according to a 0/1 index wave. Inspired by A.G.'s comment here:
https://www.wavemetrics.com/forum/general/removing-row-matrix-contains-specific-value-first-column
although I did not follow his suggestion to transpose the matrix in case rows are supposed to be eliminated. At least in my few tests the speed benefit for deleting columns was eaten up by ^t.
The snippet is quite useful for filtering large datasets in combination with MatrixOP greater/equal/within.
function DeleteRowsOrCols(wave w2d, wave idx [, int dl, int o])
// w2d is a n x m matrix; w2d MUST NOT contain NaN's
// idx is either 1D with numPnts(idx) = n or 2D with 1 x m columns
// idx has values of either 1 or 0; if 0 at p or q, rows or cols of w2d will be eliminated
// if dl is specified as non-zero integer DimLabels are preserved
// if o is specified as non-zero integer w2D is overwritten, otherwise output is named NameOfWave(w2d)_mod
variable i, dim = DimSize(idx,1) != 0 ? 1 : 0
variable nIdxPnts = DimSize(idx,dim)
variable nRows = DimSize(w2D,0)
variable nCols = DimSize(w2D,1)
MatrixOP/FREE nKeeps = sum(idx)
// change idx from 0/1 to NaN/1; make sure idx is at least SP, required after e.g. MatrixOP greater/within/equal
MatrixOP/FREE tmp = replace(fp32(idx), 0, NaN)
if (dim == 0)
// eliminate rows
if(nRows != nIdxPnts)
print "Incompatible dimensions!"
return 0
endif
MatrixOP/FREE out = redimension(zapNaNs(scaleRows(w2d,tmp)), nKeeps, nCols)
else
// eliminate cols
if(nCols != nIdxPnts)
print "Incompatible dimensions!"
return 0
endif
MatrixOP/FREE out = redimension(zapNaNs(scaleCols(w2d,tmp)), nRows, nKeeps)
endif
// preserve Dimlabels?
if(!paramIsDefault(dl) && dl != 0)
if (dim == 0)
MatrixOP/FREE DLidx = zapNaNs(scaleRows(tmp,indexRows(idx)))
CopyDimlabels/Cols=1 w2d, out
else
MatrixOP/FREE DLidx = zapNaNs(scaleCols(tmp,indexCols(idx)))
CopyDimlabels/Rows=0 w2d, out
endif
for(i=0; i<nKeeps[0]; i++)
SetDimlabel dim, i, $GetDimLabel(w2d, dim, DLidx[i]), out
endfor
endif
// overwrite or rename output
if(!paramIsDefault(o) && o != 0)
Duplicate/O out, w2d
else
Duplicate/O out, $NameOfWave(w2d)+"_mod"
endif
return 1
end
// w2d is a n x m matrix; w2d MUST NOT contain NaN's
// idx is either 1D with numPnts(idx) = n or 2D with 1 x m columns
// idx has values of either 1 or 0; if 0 at p or q, rows or cols of w2d will be eliminated
// if dl is specified as non-zero integer DimLabels are preserved
// if o is specified as non-zero integer w2D is overwritten, otherwise output is named NameOfWave(w2d)_mod
variable i, dim = DimSize(idx,1) != 0 ? 1 : 0
variable nIdxPnts = DimSize(idx,dim)
variable nRows = DimSize(w2D,0)
variable nCols = DimSize(w2D,1)
MatrixOP/FREE nKeeps = sum(idx)
// change idx from 0/1 to NaN/1; make sure idx is at least SP, required after e.g. MatrixOP greater/within/equal
MatrixOP/FREE tmp = replace(fp32(idx), 0, NaN)
if (dim == 0)
// eliminate rows
if(nRows != nIdxPnts)
print "Incompatible dimensions!"
return 0
endif
MatrixOP/FREE out = redimension(zapNaNs(scaleRows(w2d,tmp)), nKeeps, nCols)
else
// eliminate cols
if(nCols != nIdxPnts)
print "Incompatible dimensions!"
return 0
endif
MatrixOP/FREE out = redimension(zapNaNs(scaleCols(w2d,tmp)), nRows, nKeeps)
endif
// preserve Dimlabels?
if(!paramIsDefault(dl) && dl != 0)
if (dim == 0)
MatrixOP/FREE DLidx = zapNaNs(scaleRows(tmp,indexRows(idx)))
CopyDimlabels/Cols=1 w2d, out
else
MatrixOP/FREE DLidx = zapNaNs(scaleCols(tmp,indexCols(idx)))
CopyDimlabels/Rows=0 w2d, out
endif
for(i=0; i<nKeeps[0]; i++)
SetDimlabel dim, i, $GetDimLabel(w2d, dim, DLidx[i]), out
endfor
endif
// overwrite or rename output
if(!paramIsDefault(o) && o != 0)
Duplicate/O out, w2d
else
Duplicate/O out, $NameOfWave(w2d)+"_mod"
endif
return 1
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More