View Raw SPL

/* convert row, col indices to unraveled form */
sub2ind(nr, nc, np, row, col, page)
{
        local ind;

        (nr, nc, np, row, col, page) = sub2ind_parse_args(nr, nc, np, row, col, page);

        if (isempty(page))
        {
                /* 2D case */
                ind = (col - 1) * nr + row;
        }
        else
        {
                /* 3D case */
                ind = (page - 1) * nr * nc + (col - 1) * nr + row;
        }

        return(ind);
}


/* parse input args */
sub2ind_parse_args(nr, nc, np, row, col, page)
{
        if (argc < 6)
        {
                if (argc == 5)
                {
                        page = (isarray(row)) ? ones(size(row)) : 1;
                }
                else if (argc == 4)
                {
                        if (isarray(nr))
                        {
                                if (numrows(nr) == 3)
                                {
                                        /* 3D with size - (size, row, col, page) */
                                        page = row;
                                        col  = np;
                                        row  = nc;

                                        np   = nr[3];
                                        nc   = nr[2];
                                        nr   = nr[1];
                                }
                                else
                                {
                                        error(sprintf("%s - 3x1 size array expected", __CALLER__));
                                }
                        }
                        else
                        {
                                if (isarray(np))
                                {
                                        /* 2D - (nr, nc, row, col) */
                                        col  = row;
                                        row  = np;
                                        np   = 1;

                                        page = (isarray(row)) ? ones(size(row)) : 1;
                                }
                                else if (isarray(row))
                                {
                                        /* 3D - (nr, nc, np, {row, col, page}}) */
                                        page = col(row, 3);
                                        col  = col(row, 2);
                                        row  = col(row, 1);
                                }
                                else
                                {
                                        /* 2D - (nr, nc, row, col) */
                                        col  = row;
                                        row  = np;
                                        np   = 1;

                                        page = (isarray(row)) ? ones(size(row)) : 1;
                                }
                        }
                }
                else if (argc == 3)
                {
                        if (isarray(nr) && numrows(nr) >= 2)
                        {
                                if (numrows(nr) == 3)
                                {
                                        /* 3D - (size, row, col) */
                                        col  = np;
                                        row  = nc;
                                        np   = nr[3];
                                        nc   = nr[2];
                                        nr   = nr[1];

                                        page = (isarray(row)) ? ones(size(row)) : 1;
                                }
                                else
                                {
                                        /* 2D - (size, row, col) */
                                        col  = np;
                                        row  = nc;
                                        np   = 1;
                                        nc   = nr[2];
                                        nr   = nr[1];

                                        page = (isarray(row)) ? ones(size(row)) : 1;
                                }
                        }
                        else
                        {
                                error(sprintf("%s - 4 inputs expected", __CALLER__));
                        }
                }
                else
                {
                        error(sprintf("%s - too few inputs", __CALLER__));
                }
        }

        return(nr, nc, np, row, col, page);
}