Index: numpy/core/tests/test_defmatrix.py
===================================================================
--- numpy/core/tests/test_defmatrix.py	(revision 5036)
+++ numpy/core/tests/test_defmatrix.py	(working copy)
@@ -179,6 +179,63 @@
         x[:,1] = y>0.5
         assert_equal(x, [[0,1],[0,0],[0,0]])
 
+class TestVector(NumpyTestCase):
+    def check_basic(self):
+        x = Vector([1,2,3])
+        assert_equal(x.shape,(1,3))
 
+        x = Vector([1,2,3]).T
+        assert_equal(x.shape,(3,1))
+
+        self.failUnlessRaises(ValueError, Vector, [[1,2,3],[4,5,6]])
+
+    def check_type(self):
+        v = Vector([1,2,3])
+        assert_equal(type(v.T*v),matrix)
+        assert_equal(type(v+1),Vector)
+        assert_equal(type(v+v),Vector)
+        assert_equal(type(v+matrix([1,2,3])),matrix)
+
+    def check_construction(self):
+        for obj in [array([1,2,3]),
+                    matrix([[1,2,3]]),
+                    [[1,2,3]],
+                    [1,2,3]]:
+            v = Vector(obj)
+            assert_equal(type(v),Vector)
+
+    def check_slice(self):
+        m = matrix([[1,2,3],[4,5,6]])
+        assert isscalar(m[0][0])
+        assert_equal(type(m[0,:]),type(m[0]))
+
+        assert_equal(m[0,:].shape,m[0].shape)
+        assert_equal(m[:,0].shape,(2,1))
+
+    def check_to_matrix(self):
+        v = Vector([1,2,3])
+        assert_equal(v.A.shape,(1,3))
+
+        v = Vector([[1],[2],[3]])
+        assert_equal(v.A.shape,(3,1))
+
+    def check_assignment(self):
+        v = Vector([1,2,3])
+        v[0] = 3
+        assert_equal(v.A,[[3,2,3]])
+
+        v = Vector([[1],[2],[3]])
+        v[2] = 5
+        assert_equal(v,[[1],[2],[5]])
+
+        v = Vector([1,2,3])
+        v[0,:] = 3
+        assert_equal(v.A,[[3,3,3]])
+
+        v = Vector([[1],[2],[3]])
+        v[:,0] = 3
+        assert_equal(v.A,[[3],[3],[3]])
+
+
 if __name__ == "__main__":
     NumpyTest().run()
Index: numpy/core/defmatrix.py
===================================================================
--- numpy/core/defmatrix.py	(revision 5036)
+++ numpy/core/defmatrix.py	(working copy)
@@ -1,4 +1,4 @@
-__all__ = ['matrix', 'bmat', 'mat', 'asmatrix']
+__all__ = ['matrix', 'bmat', 'mat', 'asmatrix', 'Vector']
 
 import sys
 import numeric as N
@@ -155,13 +155,13 @@
     """
     __array_priority__ = 10.0
     def __new__(subtype, data, dtype=None, copy=True):
-        if isinstance(data, matrix):
+        if isinstance(data, subtype):
             dtype2 = data.dtype
             if (dtype is None):
                 dtype = dtype2
             if (dtype2 == dtype) and (not copy):
-                return data
-            return data.astype(dtype)
+                return data.view(subtype)
+            return data.astype(dtype).view(subtype)
 
         if isinstance(data, N.ndarray):
             if dtype is None:
@@ -243,8 +243,11 @@
                 n = 0
             if n > 1 and isscalar(index[1]):
                 out.shape = (sh,1)
+                return out.view(Vector)
             else:
                 out.shape = (1,sh)
+                return out.view(Vector)
+
         return out
 
     def _get_truendim(self):
@@ -506,6 +509,34 @@
     H = property(getH, None, doc="hermitian (conjugate) transpose")
     I = property(getI, None, doc="inverse")
 
+
+class Vector(matrix):
+    __array_priority__ = 1.0
+    def __new__(subtype, data, dtype=None, copy=True):
+        if not hasattr(data,'ndim'):
+            data = N.array(data)
+
+        if (data.ndim == 2 and 1 not in data.shape) or (data.ndim > 2):
+            raise ValueError("Vector input must be 1xN or Nx1")
+        else:
+            return matrix.__new__(subtype, data, dtype, copy)
+
+    def __getitem__(self,index):
+        if N.isscalar(index):
+            return self.flat.__getitem__(index)
+        else:
+            return matrix.__getitem__(self,index)
+
+    def __setitem__(self,index,value):
+        if N.isscalar(index):
+            self.flat[index] = value
+        else:
+            N.ndarray.__setitem__(self,index,value)
+
+    def __repr__(self):
+        return matrix.__repr__(self).replace('matrix', 'Vector')
+
+
 def _from_string(str,gdict,ldict):
     rows = str.split(';')
     rowtup = []
