discrete numerical 2D gradient
- To: mathgroup at smc.vnet.net
- Subject: [mg113084] discrete numerical 2D gradient
- From: Sebastian Schmitt <sschmitt at physi.uni-heidelberg.de>
- Date: Tue, 12 Oct 2010 13:49:53 -0400 (EDT)
Dear all! I have 2D data represented as a matrix. I would like to obtain the gradient. I searched quite some time in the Mathematica documentation to find a function that does the job without success. Therefore I came up with something myself. It is more for illustrative purposes than real life application, e.g. I'm taking a simply forward difference. Could you please take a look at my solution? (it should be copy'n'pastable) ------------------------------------------------------------------------ nrows = 10; ncolumns = 10; dataMatrix = Table[i*j, {i, nrows}, {j, ncolumns}]; dataMatrix//MatrixPlot fwdDifferenceMatrix = SparseArray[{Band[{1, 1}] -> 1, Band[{1, 2}] -> -1}, {nrows, ncolumns}, 0] ; fwdDifferenceMatrix//MatrixForm dxMatrix = dataMatrix.fwdDifferenceMatrix; dyMatrix = Transpose[Transpose[dataMatrix].fwdDifferenceMatrix]; dxyMatrix = Function[{u, v}, List[u, v], Listable][dxMatrix, dyMatrix]; subdxyMatrix = dxyMatrix[[2 ;;, 2 ;;]]; Rotate[ListVectorPlot[subdxyMatrix],-90Degree] ------------------------------------------------------------------------ Is there a better (both mathematical and Mathematical) to construct the y-derivatives (dyMatrix)? I had also expected to find a built-in function to combine dxMatrix and dyMatrix to a matrix of vectors. But maybe I just have to accept to use pure function a lot. The last problem I have is that ListVectorPlot has its origin in the lower-left corner while the matrix counts from upper-left to lower-right. I simply rotated the plot. Could I have done something else? Thanks in advance, Sebastian
- Follow-Ups:
- Re: discrete numerical 2D gradient
- From: Mark McClure <mcmcclur@unca.edu>
- Re: discrete numerical 2D gradient