Класс CompRowMatrix
на самом деле не предназначен для использования в качестве вектора-строки, скорее он используется для представления разреженных матриц таким образом, чтобы можно было легко выполнять итерацию по элементам матрицы строка за строкой.
Хотя можно использовать CompRowMatrix
в качестве вектора, установив все строки, кроме 1-й, равными нулю, это более сложно для вас как программиста и менее эффективно для кода, который должен предполагать, что другие строки потенциально могут стать ненулевыми.
Вместо этого используйте объект DenseVector
для хранения вектора-строки и используйте multi из интерфейса Matrix
. Он принимает два объекта Vector
в качестве аргументов и производит векторно-матричное произведение. Метод вызывается для умножения матричного объекта со следующими аргументами:
- 1-й аргумент,
x
, — это вектор, который вы хотите умножить на свою матрицу.
- 2-й аргумент,
y
, содержит результат умножения
Таким образом, чтобы получить векторно-матричное произведение y = x*A
(где и x
, и y
являются векторами-строками 1
xn
, а A
является матрицей n
xn
), вы должны сделать что-то вроде этого:
// 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 для текущей версии, но я заметил несколько различий между ним и текущий исходный код.
person
Mark S
schedule
05.03.2014