Delete rows or columns of a 2D wave (DimLabel aware)

Snippet to delete rows or columns of a 2D wave according to a 0/1 index wave. Inspired by A.G.'s comment here:

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
        MatrixOP/FREE out = redimension(zapNaNs(scaleRows(w2d,tmp)), nKeeps, nCols)
        // eliminate cols
        if(nCols != nIdxPnts)
            print "Incompatible dimensions!"
            return 0
        MatrixOP/FREE out = redimension(zapNaNs(scaleCols(w2d,tmp)), nRows, nKeeps)
    // preserve Dimlabels?
    if(!paramIsDefault(dl) && dl != 0)
        if (dim == 0)
            MatrixOP/FREE DLidx = zapNaNs(scaleRows(tmp,indexRows(idx)))
            CopyDimlabels/Cols=1 w2d, out
            MatrixOP/FREE DLidx = zapNaNs(scaleCols(tmp,indexCols(idx)))
            CopyDimlabels/Rows=0 w2d, out
        for(i=0; i<nKeeps[0]; i++)
            SetDimlabel dim, i, $GetDimLabel(w2d, dim, DLidx[i]), out
    // overwrite or rename output
    if(!paramIsDefault(o) && o != 0)
        Duplicate/O out, w2d
        Duplicate/O out, $NameOfWave(w2d)+"_mod"

    return 1





Igor Pro 9

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More