/* 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);
}