Try our new documentation site (beta).


Gurobi matrix variable object. An MVar is a NumPy ndarray of Gurobi variables. Variables are always associated with a particular model. You typically create these objects using Model.addMVar.

You generally use MVar objects to build matrix expressions, typically using overloaded operators. You can build linear matrix expressions or quadratic matrix expressions:

  expr1 = A @ x
  expr2 = A @ x + B @ y + z
  expr3 = x @ A @ x + y @ B @ y
The first two expressions are linear, while the third is quadratic.

Dimensions and data types must always be compatible. In the examples above, matrix <span>$</span>A<span>$</span> must be either a NumPy ndarray with two dimensions or a SciPy sparse matrix (which will always have two dimensions), and <span>$</span>x<span>$</span> must be a 1-D MVar. In expr1, the size of the second dimension of <span>$</span>A<span>$</span> must be equal to the length of <span>$</span>x<span>$</span>. The same must be true of <span>$</span>B<span>$</span> and <span>$</span>y<span>$</span> in expr2. In addition, the size of the first dimension of <span>$</span>A<span>$</span> in expr2 must be equal to the size of the first dimension of <span>$</span>B<span>$</span>, and also to the length of <span>$</span>z<span>$</span>.

For expr3, the size of the first dimension of <span>$</span>A<span>$</span> must be equal to the length of the MVar on the left, and the size of the second dimension must be equal to the length of the MVar on the right. The same is true for <span>$</span>B<span>$</span>.

An expression is typically then passed to setObjective (to set the optimization objective) or addConstr (to add a constraint).

Variable objects have a number of attributes. The full list can be found in the Attributes section of this document. Some variable attributes can only be queried, while others can also be set. Recall that the Gurobi optimizer employs a lazy update approach, so changes to attributes don't take effect until the next call to Model.update, Model.optimize, or Model.write on the associated model.

We should point out a few things about variable attributes. Consider the lb attribute. Its value can be queried using The Gurobi library ignores letter case in attribute names, so it can also be queried as var.LB. It can be set using a standard assignment statement (e.g., = 0). However, as mentioned earlier, attribute modification is done in a lazy fashion, so you won't see the effect of the change immediately. And some attributes can not be set (e.g., the x attribute), so attempts to assign new values to them will raise an exception.

You can also use MVar.getAttr/ MVar.setAttr to access attributes. The attribute name can be passed to these routines as a string, or you can use the constants defined in the GRB.Attr class (e.g., GRB.Attr.LB).


Try Gurobi for Free

Choose the evaluation license that fits you best, and start working with our Expert Team for technical guidance and support.

Evaluation License
Get a free, full-featured license of the Gurobi Optimizer to experience the performance, support, benchmarking and tuning services we provide as part of our product offering.
Academic License
Gurobi supports the teaching and use of optimization within academic institutions. We offer free, full-featured copies of Gurobi for use in class, and for research.
Cloud Trial

Request free trial hours, so you can see how quickly and easily a model can be solved on the cloud.