21 return qmatrix(dim, qvector(dim, 0));
24qmatrix getConstantMatrix(
size_t dim, qcomp elem) {
27 return qmatrix(dim, qvector(dim, elem));
35 for (
size_t i=0; i<dim; i++)
41qmatrix getDiagonalMatrix(qvector v) {
42 DEMAND( v.size() >= 1 );
46 for (
size_t i=0; i<v.size(); i++)
52qmatrix getPauliMatrix(
int id) {
57 return {{1 ,0}, {0, 1}};
60 return {{0, 1}, {1, 0}};
63 return {{0, -1_i}, {1_i, 0}};
66 return {{1, 0}, {0, -1}};
77qmatrix operator * (
const qcomp& a,
const qmatrix& m) {
81 for (
auto& elem : row)
87qmatrix operator * (
const qmatrix& m,
const qcomp& a) {
91qmatrix operator *= (qmatrix& m,
const qcomp& a) {
96qmatrix operator * (
const qreal& a,
const qmatrix& m) {
97 return qcomp(a,0) * m;
100qmatrix operator * (
const qmatrix& m,
const qreal& a) {
104qmatrix operator *= (qmatrix& m,
const qreal& a) {
114qmatrix operator / (
const qmatrix& m,
const qcomp& a) {
115 DEMAND( std::abs(a) != 0 );
120qmatrix operator /= (qmatrix& m,
const qcomp& a) {
125qmatrix operator / (
const qmatrix& m,
const qreal& a) {
126 return m / qcomp(a,0);
129qmatrix operator /= (qmatrix& m,
const qreal& a) {
139qmatrix operator + (
const qmatrix& m1,
const qmatrix& m2) {
140 DEMAND( m1.size() == m2.size() );
144 for (
size_t r=0; r<m1.size(); r++)
145 for (
size_t c=0; c<m1.size(); c++)
146 out[r][c] += m2[r][c];
151qmatrix operator += (qmatrix& m1,
const qmatrix& m2) {
161qmatrix operator - (
const qmatrix& m1,
const qmatrix& m2) {
162 return m1 + (-1 * m2);
165qmatrix operator -= (qmatrix& m1,
const qmatrix& m2) {
175qmatrix operator * (
const qmatrix& m1,
const qmatrix& m2) {
176 DEMAND( m1.size() > 0 );
177 DEMAND( m2.size() > 0 );
178 DEMAND( m1[0].size() == m2.size() );
183 qmatrix out = qmatrix(m1.size(), qvector(m2[0].size(),0));
185 for (
size_t r=0; r<out.size(); r++)
186 for (
size_t c=0; c<out[0].size(); c++)
187 for (
size_t k=0; k<m2.size(); k++)
188 out[r][c] += m1[r][k] * m2[k][c];
193qmatrix operator *= (qmatrix& m1,
const qmatrix& m2) {
204 DEMAND( sub.size() > 0 );
205 DEMAND( sub .size() + r <= dest.size() );
206 DEMAND( sub[0].size() + c <= dest.size() );
212 for (
size_t i=0; i<sub.size(); i++)
213 for (
size_t j=0; j<sub[i].size(); j++)
214 dest[r+i][c+j] = sub[i][j];
217void setSubMatrix(qmatrix &dest, qvector sub,
size_t flatInd) {
218 DEMAND( sub.size() + flatInd <= dest.size()*dest.size() );
220 for (
size_t i=0; i<sub.size(); i++) {
221 size_t r = (i + flatInd) / dest.size();
222 size_t c = (i + flatInd) % dest.size();
227void setToDebugState(qmatrix &m) {
228 DEMAND( !m.empty() );
233 for (
size_t c=0; c<m.size(); c++) {
234 for (
size_t r=0; r<m.size(); r++) {
235 m[r][c] = qcomp(2*i/10., (2*i+1)/10.);
246qvector getDiagonals(qmatrix m) {
247 DEMAND( m.size() > 1 );
249 qvector out = getZeroVector(m.size());
251 for (
size_t i=0; i<out.size(); i++)
qmatrix getIdentityMatrix(size_t dim)
void setSubMatrix(qmatrix &dest, qmatrix sub, size_t r, size_t c)
qmatrix getZeroMatrix(size_t dim)