2013-07-09 2 views
1

Я пишу программу java, которая включает в себя работу с матрицей 1058 X 1058, содержащей значения float. Эта матрица содержит много нулевых значений, поэтому мне нужно сохранить это как разреженную матрицу, а затем использовать эту матрицу для создания связующего дерева. Я проверил множество популярных библиотек, таких как Colt, Jama, но почему-то я не могу заставить их работать с моим кодом. Я хотел бы иметь систему координат хранения (аналогично получены в MATLAB, используя функцию разреженный()), как это:Создать разреженную матрицу с системой хранения координат?

(1055,1045) 1.0000 
(1056,1045) 1.0000 
(1057,1045) 1.0000 
(1058,1045) 1.0000 
(1047,1046) 1.0000 
(1048,1046) 1.0000 
(1049,1046) 1.0000 
(1050,1046) 1.0000 
(1051,1046) 1.0000 
(1052,1046) 1.0000 
(1053,1046) 1.0000 
(1054,1046) 1.0000 
(1055,1046) 1.0000 

Может кто-нибудь подскажет, как идти об этом?

+0

_ «Я проверил много популярных библиотек, как Colt, Джам, но почему-то я не могу поставить их на работу с моим кодом.» _ Если вы дать больше подробно о проблемах, которые у вас были с этими библиотеками, мы могли бы помочь вам заставить их работать. – Kevin

+0

Я пытаюсь использовать методы класса SparseDoubleMatrix2D (http://acs.lbl.gov/software/colt/api/cern/colt/matrix/impl/SparseDoubleMatrix2D.html#assign(cern.colt.matrix.DoubleMatrix2D) .Но я не могу генерировать муль тический вывод координаты, используя перечисленные там методы. – novicegeek

ответ

0

Вы можете сделать это быстро, без каких-либо lib. Создайте следующий класс:

MatrixIndex implements Comparable<MatrixIndex> 
{ 
    private final int _x; 
    private final int _y; 

    ... 
} 

Затем используйте его в некоторых:

TreeMap<MatrixIndex,Double> 

Приветствия

+0

Благодарим вас за ответ. Я прочитал больше о компараторе и TreeMap и получил представление о том, как его реализовать. класс MatrixIndex, является компаратором, требуемым в этом случае? Насколько я понимаю, TreeMap дает данные о возврате отсортированным образом, и поскольку мое возвращаемое значение будет координатами и значением, которые являются числами, поэтому они будут уже отсортированы. Если я использую компаратор как вы предположили, как мне получить значения матрицы float [] [] в этом? Заранее спасибо – novicegeek

+0

Мне удалось получить желаемый результат с помощью TreeMap. Спасибо за помощь! – novicegeek

0

Существует la4j (Линейная алгебра для Java) библиотека, которая обрабатывает это с CRSMatrix/CCSMatrix разреженной матрицей типов и MatrixMarketStream класс. Вот краткий пример:

Исходный файл "matrix.mm" (5x5 матрица с 8 ненулевых элементов):

%%MatrixMarket matrix coordinate real general 
5 5 8 
1  1 1.000e+00 
2  2 1.050e+01 
3  3 1.500e-02 
1  4 6.000e+00 
4  2 2.505e+02 
4  4 -2.800e+02 
4  5 3.332e+01 
5  5 1.200e+01 

Java источник (использование la4j):

Matrix a = new CRSMatrix(Matrices.asMatrixMarketSource(
          new FileInputStream(new File("matrix.mm")))); 

System.out.println("DET(A) = " + a.determinant()); 

О формат MatrixMarket читается here. О форматах CRS/CCS читайте here и here.

Для генерации выходного использования MatrixMarket следующего кода:

Matrix a = new CRSMatrix(...); 
MatrixStream out = new MatrixMarketStream(new FileOutputStream(
         new File("matrix.mm"))); 

out.writeMatrix(a); 
Смежные вопросы