2015-04-23 2 views
2

С собственному (C++) я хочу, чтобы иметь такой же результат, как Matlab в одном:разреженная матрица из триплета

% Matlab code: Create a 1500-by-1500 sparse matrix from the triplets i, j, 
 
      and v 
 
i = [900 1000]; 
 
    j = [900 1000]; 
 
    v = [10 100]; 
 
    S = sparse(i,j,v,1500,1500) 
 

 
    %result 
 
    S = 
 

 
(900,900)  10 
 
(1000,1000) 100

Я хочу сделать то же самое в C++, я видел в разных сообщения, которые мы можем обрабатывать разреженные матрицы с Eigen Library, но я действительно не понимал, как это сделать. Вы можете мне помочь ?

Благодаря

+0

Что ваш текущий лучший судебный процесс для него? Вам нужно предоставить собственный код, чтобы получить помощь в его исправлении. См. [Ask]. – mins

ответ

1

Создать вектор троек

typedef Eigen::Triplet<int> Trip; 
std::vector<Trip> trp; 

Создать триплеты

trp.push_back(Trip(900,900,10)); // (index, index, value) 
trp.push_back(Trip(1000,1000,100)); 

Назначьте их в разреженную матрицу Эйгеном

int rows, cols; 
rows = cols = 1500; 
Eigen::SparseMatrix<int> A(rows,cols); 

A.setFromTriplets(trp.begin(), trp.end()); 

Распечатать все (плотная) матрица

std::cout << A << std::endl; 

или печатать только индексы и значения

std::cout << "Row\tCol\tVal" <<std::endl; 
for (int k=0; k < A.outerSize(); ++k) 
{ 
    for (SparseMatrix<int>::InnerIterator it(A,k); it; ++it) 
    { 
     std::cout << it.row() << "\t"; // row index 
     std::cout << it.col() << "\t"; // col index (here it is equal to k) 
     std::cout << it.value() << std::endl; 
    } 
} 
+0

Хорошо. Я хочу понять, если это возможно. Почему вы назначили значения в этом порядке на 2 триплета? почему мы не используем 3 триплета? Я думаю, что до сих пор не понимаю структуру Триплета. Как я могу визуализировать результат как результат Matlab? – ananass

+0

[Eigen :: Triplet] (http://eigen.tuxfamily.org/dox/classEigen_1_1Triplet.html) - простая структура, содержащая единственный набор 'i, j, v'. Если вам нужно 32 элемента в вашей матрице, вы бы создали 32 Triplets. Если в вашем примере у вас есть вектор для каждого 'i',' j' и 'v', здесь у вас есть транспонирование. –

+0

Хорошо, я сделал это, но я все еще запутался. Редкая матрица имеет целью не сохранять нулевые значения. Здесь матрица A хранит значения нулей. Я не знаю, видите ли вы, что я имею в виду? – ananass

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