2011-04-28 2 views
0

мне нужно реализовать формулу умножения, где строка матрица размера «п» должны быть умножена на п * п матрицу ..создания вектора-строки в Java матричного набор инструментов (MTJ)

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

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

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

плз помочь

ответ

3

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

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

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

  • первый аргумент, x, вектор вы хотите умножить с матрицей
  • второй ARG, 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 при построении соответствующих объектов и Matrix. Если вы не собираетесь использовать массивы для каких-либо других целей, вам, вероятно, не следует выполнять эту глубокую копию. Вы делаете это, передавая дополнительный логический параметр, установленный в false в конструкторе, например.

// create matrix A without deep copying matValues 
Matrix A = new DenseMatrix(matValues, false); 

Вы должны сослаться на javadoc, с которым вы и я связаны ранее, для получения дополнительных параметров конструктора. Помните, однако, что javadoc для другой версии, что текущая версия MTJ (версия 1.01 на момент публикации). Я не знаю, для какой версии это, и я не смог найти javadoc для текущей версии, но я обнаружил несколько различий между ним и current source code.

2

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

Смежные вопросы