diff --git a/MagickCore/matrix.c b/MagickCore/matrix.c
index 8139f42..53ce0ca 100644
--- a/MagickCore/matrix.c
+++ b/MagickCore/matrix.c
@@ -643,6 +643,24 @@
 %
 */
 
+static inline ssize_t EdgeX(const ssize_t x,const size_t columns)
+{
+  if (x < 0L)
+    return(0L);
+  if (x >= (ssize_t) columns)
+    return((ssize_t) (columns-1));
+  return(x);
+}
+
+static inline ssize_t EdgeY(const ssize_t y,const size_t rows)
+{
+  if (y < 0L)
+    return(0L);
+  if (y >= (ssize_t) rows)
+    return((ssize_t) (rows-1));
+  return(y);
+}
+
 static inline MagickOffsetType ReadMatrixElements(
   const MatrixInfo *restrict matrix_info,const MagickOffsetType offset,
   const MagickSizeType length,unsigned char *restrict buffer)
@@ -686,10 +704,8 @@
 
   assert(matrix_info != (const MatrixInfo *) NULL);
   assert(matrix_info->signature == MagickSignature);
-  i=(MagickOffsetType) matrix_info->rows*x+y;
-  if ((i < 0) ||
-      ((MagickSizeType) (i*matrix_info->stride) >= matrix_info->length))
-    return(MagickFalse);
+  i=(MagickOffsetType) EdgeY(y,matrix_info->rows)*matrix_info->columns+
+    EdgeX(x,matrix_info->columns);
   if (matrix_info->type != DiskCache)
     {
       (void) memcpy(value,(unsigned char *) matrix_info->elements+i*
@@ -959,7 +975,7 @@
 
   assert(matrix_info != (const MatrixInfo *) NULL);
   assert(matrix_info->signature == MagickSignature);
-  i=(MagickOffsetType) matrix_info->rows*x+y;
+  i=(MagickOffsetType) y*matrix_info->columns+x;
   if ((i < 0) ||
       ((MagickSizeType) (i*matrix_info->stride) >= matrix_info->length))
     return(MagickFalse);