Создание вектора строки в Java Java Toolkit (MTJ) - PullRequest
0 голосов
/ 28 апреля 2011

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

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

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

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

PLZ Help

Ответы [ 2 ]

4 голосов
/ 06 марта 2014

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

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

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

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

Таким образом, чтобы получить векторно-матричное произведение y = x*A (где оба x и y являются 1 x n векторными строкамии A - матрица n x 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 для текущей версии, но я обнаружил некоторые различия между ней и текущим исходным кодом .

2 голосов
/ 27 сентября 2011

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

...