Класс CompRowMatrix
не предназначен для использования в качестве вектора строк, скорее он используется для представления разреженных матриц таким образом, что его можно легко перебирать по матричным элементам по строкам.
В качестве вектора можно использовать CompRowMatrix
, установив все строки, отличные от 1-го до нуля, это сложнее для вас как программиста и менее эффективно для кода, который должен предполагать, что другие строки потенциально могут стать ненулевая.
Вместо этого используйте объект DenseVector
, чтобы провести вектор строки и использовать метод mult из интерфейса Matrix
. Он принимает два объекта Vector
как аргументы и создает векторно-матричный продукт. Метод вызывается на объекте матричного умножения со следующими аргументами:
- первый аргумент,
x
, вектор вы хотите умножить с матрицей
- второй ARG,
y
, держит результат умножения
Таким образом, для получения векторно-матричного продукта y = x*A
(где оба x
и y
являются 1
х n
векторов-строки и A
является n
х n
матрица), вы могли бы сделать что-то вроде этого:
// create matrix A
double[][] matValues = new double[n][n];
... // initialize values of the matrix
Matrix A = new DenseMatrix(matValues);
// create vector x
double[] vecValues = new double[n];
... // initialize values of the vector
Vector x = new DenseVector(vecValues);
// create vector y to store result of multiplication
Vector y = new DenseVector(n);
// perform multiplication
A.mult(x, y);
Теперь вы можете использовать y
в остальной части вашего кода по мере необходимости. Важно, чтобы перед умножением вы выделяли y
, но не имеет значения, какие данные они хранят. Метод mult
перезапишет все, что находится в y
при выходе.
Также обратите внимание, что способы, которые я выбрал для инициализации x
и A
, были не единственными доступными способами.Например, приведенный выше код автоматически копирует массивы vecValues
и matValues
при построении соответствующих объектов и Matrix
. Если вы не собираетесь использовать массивы для каких-либо других целей, вам, вероятно, не следует выполнять эту глубокую копию. Вы делаете это, передавая дополнительный логический параметр, установленный в false в конструкторе, например.
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
Вы должны сослаться на javadoc, с которым вы и я связаны ранее, для получения дополнительных параметров конструктора. Помните, однако, что javadoc для другой версии, что текущая версия MTJ (версия 1.01 на момент публикации). Я не знаю, для какой версии это, и я не смог найти javadoc для текущей версии, но я обнаружил несколько различий между ним и current source code.