создание вектора-строки в наборе инструментов Java Matrix (MTJ)

Мне нужно реализовать формулу умножения, в которой матрица строк размера «n» должна быть умножена на матрицу n * n.

Я использовал класс DenseMatrix для создания матрицы n * n из двумерного массива... но моя проблема заключается в том, как создать вектор строки...

Я могу использовать класс CompRowMatrix для создания матрицы строк... но для этого ввод должен быть "Matrix"... но Matrix - это интерфейс... не могу создать его экземпляр... первый конструктор класс CompRowMatrix указывает, что для него требуется "ненулевое массив индексов в качестве входных данных.. но я не могу понять, что это за ненулевой массив индексов??

также я могу создать вектор с помощью DenseVector или любой другой подходящий класс.. но, похоже, не существует метода прямого умножения вектора на матрицу..

помогите пожалуйста


person Navin Israni    schedule 28.04.2011    source источник


Ответы (2)


Класс CompRowMatrix на самом деле не предназначен для использования в качестве вектора-строки, скорее он используется для представления разреженных матриц таким образом, чтобы можно было легко выполнять итерацию по элементам матрицы строка за строкой.

Хотя можно использовать CompRowMatrix в качестве вектора, установив все строки, кроме 1-й, равными нулю, это более сложно для вас как программиста и менее эффективно для кода, который должен предполагать, что другие строки потенциально могут стать ненулевыми.

Вместо этого используйте объект DenseVector для хранения вектора-строки и используйте multi из интерфейса Matrix. Он принимает два объекта Vector в качестве аргументов и производит векторно-матричное произведение. Метод вызывается для умножения матричного объекта со следующими аргументами:

  • 1-й аргумент, x, — это вектор, который вы хотите умножить на свою матрицу.
  • 2-й аргумент, y, содержит результат умножения

Таким образом, чтобы получить векторно-матричное произведение y = x*A (где и x, и y являются векторами-строками 1xn, а A является матрицей nxn), вы должны сделать что-то вроде этого:

// 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

Если я понимаю ваш вопрос, одним из решений было бы создать матрицу с одной строкой и n столбцами для предварительного умножения матрицы n x n. Существуют процедуры для умножения векторов, но я полагаю, что все они имеют векторное пост-умножение матрицы. Если вы хотите вместо этого использовать эти подпрограммы, вам придется выполнить соответствующие транспонирования.

person gary    schedule 27.09.2011