Создание вектора строки в наборе инструментов Java-матрицы (MTJ)
Мне нужно реализовать формулу умножения, где матрица строк размером 'n' должна быть умножена на матрицу n*n.
Я использовал класс DenseMatrix для создания матрицы n*n из 2D-массива... но моя проблема заключается в том, как создать строку Vector...
Я могу использовать класс CompRowMatrix для создания матрицы строк... но для этого входные данные должны иметь значение "Matrix"... но Matrix - это интерфейс.. не может быть создан для него... первый конструктор класса CompRowMatrix заявляет, что для этого требуется "ненулевой массив индексов" в качестве входных данных... но я не могу понять, что это за ненулевой массив индексов??
Кроме того, я могу создать вектор с помощью DenseVector или любого другого подходящего класса... но, похоже, нет способа напрямую умножить вектор на матрицу...
Пожалуйста, помогите
2 ответа
CompRowMatrix
Класс на самом деле не предназначен для использования в качестве вектора строки, скорее он используется для представления разреженных матриц таким образом, чтобы можно было легко перебирать элементы матрицы строка за строкой.
Пока можно использовать CompRowMatrix
как вектор, устанавливая все строки, отличные от 1-го, в ноль, это более сложно для вас как для программиста и менее эффективно для кода, который должен предполагать, что другие строки потенциально могут стать ненулевыми.
Вместо этого используйте DenseVector
объект для хранения вашего вектора строки и использования метода Mult из 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. Есть процедуры для умножения векторов, но я полагаю, что все они имеют вектор, умножающий матрицу. Если вы хотите использовать эти процедуры вместо этого, вам нужно будет сделать соответствующие транспонирования.