12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library 22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra. 32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr> 52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla 72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed 82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include "sparse.h" 112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T> 132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtypename Eigen::internal::enable_if<(T::Flags&RowMajorBit)==RowMajorBit, typename T::RowXpr>::type 142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginnervec(T& A, Index i) 152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return A.row(i); 172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T> 202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtypename Eigen::internal::enable_if<(T::Flags&RowMajorBit)==0, typename T::ColXpr>::type 212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginnervec(T& A, Index i) 222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return A.col(i); 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename SparseMatrixType> void sparse_block(const SparseMatrixType& ref) 272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index rows = ref.rows(); 292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index cols = ref.cols(); 302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index inner = ref.innerSize(); 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Index outer = ref.outerSize(); 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename SparseMatrixType::Scalar Scalar; 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename SparseMatrixType::StorageIndex StorageIndex; 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang double density = (std::max)(8./(rows*cols), 0.01); 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Matrix<Scalar,Dynamic,Dynamic,SparseMatrixType::IsRowMajor?RowMajor:ColMajor> DenseMatrix; 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Matrix<Scalar,Dynamic,1> DenseVector; 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef Matrix<Scalar,1,Dynamic> RowDenseVector; 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef SparseVector<Scalar> SparseVectorType; 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar s1 = internal::random<Scalar>(); 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m(rows, cols); 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DenseMatrix refMat = DenseMatrix::Zero(rows, cols); 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang initSparse<Scalar>(density, refMat, m); 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m, refMat); 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // test InnerIterators and Block expressions 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (int t=0; t<10; ++t) 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j = internal::random<Index>(0,cols-2); 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index i = internal::random<Index>(0,rows-2); 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index w = internal::random<Index>(1,cols-j); 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index h = internal::random<Index>(1,rows-i); 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w)); 592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index c=0; c<w; c++) 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).col(c), refMat.block(i,j,h,w).col(c)); 622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index r=0; r<h; r++) 632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).col(c).coeff(r), refMat.block(i,j,h,w).col(c).coeff(r)); 652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).coeff(r,c), refMat.block(i,j,h,w).coeff(r,c)); 662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index r=0; r<h; r++) 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).row(r), refMat.block(i,j,h,w).row(r)); 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index c=0; c<w; c++) 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).row(r).coeff(c), refMat.block(i,j,h,w).row(r).coeff(c)); 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.block(i,j,h,w).coeff(r,c), refMat.block(i,j,h,w).coeff(r,c)); 752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleCols(j,w), refMat.middleCols(j,w)); 792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleRows(i,h), refMat.middleRows(i,h)); 802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index r=0; r<h; r++) 812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleCols(j,w).row(r), refMat.middleCols(j,w).row(r)); 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleRows(i,h).row(r), refMat.middleRows(i,h).row(r)); 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index c=0; c<w; c++) 852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.col(c).coeff(r), refMat.col(c).coeff(r)); 872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.row(r).coeff(c), refMat.row(r).coeff(c)); 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleCols(j,w).coeff(r,c), refMat.middleCols(j,w).coeff(r,c)); 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleRows(i,h).coeff(r,c), refMat.middleRows(i,h).coeff(r,c)); 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(m.middleCols(j,w).coeff(r,c) != Scalar(0)) 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleCols(j,w).coeffRef(r,c), refMat.middleCols(j,w).coeff(r,c)); 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(m.middleRows(i,h).coeff(r,c) != Scalar(0)) 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleRows(i,h).coeff(r,c), refMat.middleRows(i,h).coeff(r,c)); 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index c=0; c<w; c++) 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleCols(j,w).col(c), refMat.middleCols(j,w).col(c)); 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.middleRows(i,h).col(c), refMat.middleRows(i,h).col(c)); 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index c=0; c<cols; c++) 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.col(c) + m.col(c), (m + m).col(c)); 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.col(c) + m.col(c), refMat.col(c) + refMat.col(c)); 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index r=0; r<rows; r++) 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.row(r) + m.row(r), (m + m).row(r)); 1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m.row(r) + m.row(r), refMat.row(r) + refMat.row(r)); 1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // test innerVector() 1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); 1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m2(rows, cols); 1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang initSparse<Scalar>(density, refMat2, m2); 1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j0 = internal::random<Index>(0,outer-1); 1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j1 = internal::random<Index>(0,outer-1); 1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index r0 = internal::random<Index>(0,rows-1); 1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index c0 = internal::random<Index>(0,cols-1); 1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVector(j0), innervec(refMat2,j0)); 1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), innervec(refMat2,j0)+innervec(refMat2,j1)); 1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.innerVector(j0) *= Scalar(2); 1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang innervec(refMat2,j0) *= Scalar(2); 1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.row(r0) *= Scalar(3); 1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.row(r0) *= Scalar(3); 1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.col(c0) *= Scalar(4); 1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.col(c0) *= Scalar(4); 1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.row(r0) /= Scalar(3); 1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.row(r0) /= Scalar(3); 1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.col(c0) /= Scalar(4); 1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.col(c0) /= Scalar(4); 1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseVectorType v1; 1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(v1 = m2.col(c0) * 4, refMat2.col(c0)*4); 1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(v1 = m2.row(r0) * 4, refMat2.row(r0).transpose()*4); 1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m3(rows,cols); 1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.reserve(VectorXi::Constant(outer,int(inner/2))); 1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index j=0; j<outer; ++j) 1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index k=0; k<(std::min)(j,inner); ++k) 1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.insertByOuterInner(j,k) = internal::convert_index<StorageIndex>(k+1); 1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index j=0; j<(std::min)(outer, inner); ++j) 1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); 1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(j>0) 1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); 1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.makeCompressed(); 1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index j=0; j<(std::min)(outer, inner); ++j) 1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); 1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(j>0) 1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); 1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(m3.innerVector(j0).nonZeros() == m3.transpose().innerVector(j0).nonZeros()); 1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// m2.innerVector(j0) = 2*m2.innerVector(j1); 1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// refMat2.col(j0) = 2*refMat2.col(j1); 1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// VERIFY_IS_APPROX(m2, refMat2); 1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // test innerVectors() 1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); 1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m2(rows, cols); 1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang initSparse<Scalar>(density, refMat2, m2); 1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(internal::random<float>(0,1)>0.5f) m2.makeCompressed(); 1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j0 = internal::random<Index>(0,outer-2); 1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j1 = internal::random<Index>(0,outer-2); 1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index n0 = internal::random<Index>(1,outer-(std::max)(j0,j1)); 1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(j0,0,n0,cols)); 1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); 1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), 1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.middleRows(j0,n0)+refMat2.middleRows(j1,n0)); 2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), 2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); 2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY(m2.innerVectors(j0,n0).nonZeros() == m2.transpose().innerVectors(j0,n0).nonZeros()); 2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0); 2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.middleRows(j0,n0) = (refMat2.middleRows(j0,n0) + refMat2.middleRows(j1,n0)).eval(); 2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.middleCols(j0,n0) = (refMat2.middleCols(j0,n0) + refMat2.middleCols(j1,n0)).eval(); 2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // test generic blocks 2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); 2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m2(rows, cols); 2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang initSparse<Scalar>(density, refMat2, m2); 2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j0 = internal::random<Index>(0,outer-2); 2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index j1 = internal::random<Index>(0,outer-2); 2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index n0 = internal::random<Index>(1,outer-(std::max)(j0,j1)); 2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.block(j0,0,n0,cols), refMat2.block(j0,0,n0,cols)); 2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.block(0,j0,rows,n0), refMat2.block(0,j0,rows,n0)); 2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.block(j0,0,n0,cols)+m2.block(j1,0,n0,cols), 2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.block(j0,0,n0,cols)+refMat2.block(j1,0,n0,cols)); 2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.block(0,j0,rows,n0)+m2.block(0,j1,rows,n0), 2352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); 2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index i = internal::random<Index>(0,m2.outerSize()-1); 2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) { 2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.innerVector(i) = m2.innerVector(i) * s1; 2402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.row(i) = refMat2.row(i) * s1; 2412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2,refMat2); 2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } else { 2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m2.innerVector(i) = m2.innerVector(i) * s1; 2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat2.col(i) = refMat2.col(i) * s1; 2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2,refMat2); 2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index r0 = internal::random<Index>(0,rows-2); 2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index c0 = internal::random<Index>(0,cols-2); 2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index r1 = internal::random<Index>(1,rows-r0); 2512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index c1 = internal::random<Index>(1,cols-c0); 2522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(DenseVector(m2.col(c0)), refMat2.col(c0)); 2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.col(c0), refMat2.col(c0)); 2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(RowDenseVector(m2.row(r0)), refMat2.row(r0)); 2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.row(r0), refMat2.row(r0)); 2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2.block(r0,c0,r1,c1), refMat2.block(r0,c0,r1,c1)); 2602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX((2*m2).block(r0,c0,r1,c1), (2*refMat2).block(r0,c0,r1,c1)); 2612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(m2.nonZeros()>0) 2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m2, refMat2); 2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SparseMatrixType m3(rows, cols); 2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang DenseMatrix refMat3(rows, cols); refMat3.setZero(); 2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index n = internal::random<Index>(1,10); 2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(Index k=0; k<n; ++k) 2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index o1 = internal::random<Index>(0,outer-1); 2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index o2 = internal::random<Index>(0,outer-1); 2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(SparseMatrixType::IsRowMajor) 2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.innerVector(o1) = m2.row(o2); 2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat3.row(o1) = refMat2.row(o2); 2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else 2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.innerVector(o1) = m2.col(o2); 2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang refMat3.col(o1) = refMat2.col(o2); 2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(internal::random<bool>()) 2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m3.makeCompressed(); 2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(m3.nonZeros()>0) 2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang VERIFY_IS_APPROX(m3, refMat3); 2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangvoid test_sparse_block() 2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for(int i = 0; i < g_repeat; i++) { 2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang int r = Eigen::internal::random<int>(1,200), c = Eigen::internal::random<int>(1,200); 2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(Eigen::internal::random<int>(0,4) == 0) { 2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang r = c; // check square matrices in 25% of tries 2972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_UNUSED_VARIABLE(r+c); 2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_1(( sparse_block(SparseMatrix<double>(1, 1)) )); 3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_1(( sparse_block(SparseMatrix<double>(8, 8)) )); 3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_1(( sparse_block(SparseMatrix<double>(r, c)) )); 3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_2(( sparse_block(SparseMatrix<std::complex<double>, ColMajor>(r, c)) )); 3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_2(( sparse_block(SparseMatrix<std::complex<double>, RowMajor>(r, c)) )); 3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_3(( sparse_block(SparseMatrix<double,ColMajor,long int>(r, c)) )); 3062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_3(( sparse_block(SparseMatrix<double,RowMajor,long int>(r, c)) )); 3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang r = Eigen::internal::random<int>(1,100); 3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang c = Eigen::internal::random<int>(1,100); 3102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(Eigen::internal::random<int>(0,4) == 0) { 3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang r = c; // check square matrices in 25% of tries 3122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_4(( sparse_block(SparseMatrix<double,ColMajor,short int>(short(r), short(c))) )); 3152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang CALL_SUBTEST_4(( sparse_block(SparseMatrix<double,RowMajor,short int>(short(r), short(c))) )); 3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 318