Создание вектора строки в Java Matrix Toolkit (MTJ)
-
26-10-2019 - |
Вопрос
Мне нужно внедрить формулу умножения, где матрица строки размера 'n' должна быть умножена на матрицу n*n ..
Я использовал класс Densematrix для создания матрицы N*N из 2D -массива ... но моя проблема в том, как создать вектор строки ...
Я могу использовать класс Comprowmatrix для создания матрицы строки ... но для этого ввод должен быть «матрица» .. но матрица - это интерфейс .. не может его создавать. Первый конструктор Comprowmatrix Class Государства требуют «ненулевого массива индексов» в качестве ввода ... но я не могу понять, что это за нулевой массив индексов ??
Кроме того, я могу создать вектор с Плотный вектор или любой другой подходящий класс .. но, похоже, нет никакого метода, чтобы напрямую умножить вектор на матрицу ..
пожалуйста, помощь
Решение
А CompRowMatrix
Класс на самом деле не предназначен для использования в качестве вектора строки, скорее, он используется для представления редких матриц таким образом, что его легко идентифицировать по строке матричных элементов.
Пока можно использовать CompRowMatrix
В качестве вектора, устанавливая все строки, отличные от 1-го по ноль, это сложнее для вас как программиста и менее эффективно для кода, который должен предположить, что другие ряды могут потенциально стать ненулевыми.
Вместо этого используйте DenseVector
объект для удержания вектора строки и использования мультюр Метод из Matrix
интерфейс. Он принимает два Vector
Объекты в качестве аргументов и создают продукт вектора-матрицы. Метод вызывается на объекте матрицы, умноженный на следующие аргументы:
- 1 -й арг,
x
, вектор, который вы хотите размножаться с матрицей - 2 -й арг,
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
При построении соответствующего Vector
а также Matrix
объекты. Если вы не собираетесь использовать массивы для какой -либо другой цели, то вы, вероятно, не должны выполнять эту глубокую копию. Вы делаете это, передав дополнительный логический параметр, установленную FALSE в конструкторе, например,
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
Вам следует обратиться к Javadoc и вы, и я связал ранее для получения дополнительных вариантов конструктора. Имейте в виду, однако, что сказал, что Javadoc предназначен для другой версии, что текущее выпуск MTJ (версия 1.01 на момент времени этого поста). Я не знаю, какая это версия, и я не смог найти Javadoc для текущей версии, но я заметил несколько различий между ним и текущий исходный код.
Другие советы
Если я пойму ваш вопрос, одним из решений будет создание матрицы с одной строкой и N столбцами для председателя матрицы NXN. Существуют процедуры для умножения векторов, но я считаю, что все они имеют вектор после подъема матрицы. Если вы хотите использовать эти процедуры, вам придется провести соответствующие транспозы.