// Copyright ©2015 The Gonum Authors. All rights reserved. | |

// Use of this source code is governed by a BSD-style | |

// license that can be found in the LICENSE file. | |

// Ensure changes made to blas/native are reflected in blas/cgo where relevant. | |

/* | |

Package gonum is a Go implementation of the BLAS API. This implementation | |

panics when the input arguments are invalid as per the standard, for example | |

if a vector increment is zero. Note that the treatment of NaN values | |

is not specified, and differs among the BLAS implementations. | |

gonum.org/v1/gonum/blas/blas64 provides helpful wrapper functions to the BLAS | |

interface. The rest of this text describes the layout of the data for the input types. | |

Note that in the function documentation, x[i] refers to the i^th element | |

of the vector, which will be different from the i^th element of the slice if | |

incX != 1. | |

See http://www.netlib.org/lapack/explore-html/d4/de1/_l_i_c_e_n_s_e_source.html | |

for more license information. | |

Vector arguments are effectively strided slices. They have two input arguments, | |

a number of elements, n, and an increment, incX. The increment specifies the | |

distance between elements of the vector. The actual Go slice may be longer | |

than necessary. | |

The increment may be positive or negative, except in functions with only | |

a single vector argument where the increment may only be positive. If the increment | |

is negative, s[0] is the last element in the slice. Note that this is not the same | |

as counting backward from the end of the slice, as len(s) may be longer than | |

necessary. So, for example, if n = 5 and incX = 3, the elements of s are | |

[0 * * 1 * * 2 * * 3 * * 4 * * * ...] | |

where ∗ elements are never accessed. If incX = -3, the same elements are | |

accessed, just in reverse order (4, 3, 2, 1, 0). | |

Dense matrices are specified by a number of rows, a number of columns, and a stride. | |

The stride specifies the number of entries in the slice between the first element | |

of successive rows. The stride must be at least as large as the number of columns | |

but may be longer. | |

[a00 ... a0n a0* ... a1stride-1 a21 ... amn am* ... amstride-1] | |

Thus, dense[i*ld + j] refers to the {i, j}th element of the matrix. | |

Symmetric and triangular matrices (non-packed) are stored identically to Dense, | |

except that only elements in one triangle of the matrix are accessed. | |

Packed symmetric and packed triangular matrices are laid out with the entries | |

condensed such that all of the unreferenced elements are removed. So, the upper triangular | |

matrix | |

[ | |

1 2 3 | |

0 4 5 | |

0 0 6 | |

] | |

and the lower-triangular matrix | |

[ | |

1 0 0 | |

2 3 0 | |

4 5 6 | |

] | |

will both be compacted as [1 2 3 4 5 6]. The (i, j) element of the original | |

dense matrix can be found at element i*n - (i-1)*i/2 + j for upper triangular, | |

and at element i * (i+1) /2 + j for lower triangular. | |

Banded matrices are laid out in a compact format, constructed by removing the | |

zeros in the rows and aligning the diagonals. For example, the matrix | |

[ | |

1 2 3 0 0 0 | |

4 5 6 7 0 0 | |

0 8 9 10 11 0 | |

0 0 12 13 14 15 | |

0 0 0 16 17 18 | |

0 0 0 0 19 20 | |

] | |

implicitly becomes (∗ entries are never accessed) | |

[ | |

* 1 2 3 | |

4 5 6 7 | |

8 9 10 11 | |

12 13 14 15 | |

16 17 18 * | |

19 20 * * | |

] | |

which is given to the BLAS routine as [∗ 1 2 3 4 ...]. | |

See http://www.crest.iu.edu/research/mtl/reference/html/banded.html | |

for more information | |

*/ | |

package gonum // import "gonum.org/v1/gonum/blas/gonum" |