Класс CompRowMatrix
на самом деле не предназначен для использования в качестве вектора строки, скорее он используется для представления разреженных матриц таким образом, что легко выполнять итерацию по элементам матрицы строка за строкой.
Хотя можно использовать CompRowMatrix
в качестве вектора, задав для всех строк, отличных от 1-го, ноль, это сложнее для вас как для программиста и менее эффективно для кода, который должен предполагать, что другие строки потенциально могут статьненулевая.
Вместо этого используйте объект DenseVector
для хранения вектора строки и используйте метод mult из интерфейса Matrix
.Он принимает два Vector
объекта в качестве аргументов и создает векторно-матричное произведение.Метод вызывается для объекта матрицы, умноженного на следующие аргументы:
- 1-й аргумент,
x
, - вектор, который вы хотите умножить на матрицу - 2-й аргумент,
y
, содержит результат умножения
Таким образом, чтобы получить векторно-матричное произведение y = x*A
(где оба x
и y
являются 1
x n
векторными строкамии A
- матрица n
x 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
при построении соответствующих объектов Vector
и Matrix
.Если вы не собираетесь использовать массивы для каких-либо других целей, вам, вероятно, не следует выполнять эту глубокую копию.Вы делаете это, передавая дополнительный логический параметр, установленный в false в конструкторе, например,
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
Вы должны обратиться к javadoc, с которым вы и я связались ранее, для получения дополнительных опций конструктора.Имейте в виду, однако, что указанный Javadoc предназначен для другой версии, чем текущая версия MTJ (версия 1.01 на момент написания этой статьи).Я не знаю, для какой он версии, и мне не удалось найти javadoc для текущей версии, но я обнаружил некоторые различия между ней и текущим исходным кодом .