C + + 소스 매트릭스 계산 도구 - Eigen 의 간단 한 용법 (1)
Eigen 의 다운로드 와 설 치 는 다음 두 블 로 그 를 참고 할 수 있 습 니 다.
http://blog.csdn.net/hjx_1000/article/details/8477522
또는:http://blog.csdn.net/abcjennifer/article/details/7781936;
Eigen 도움말 문서 의 주소:http://eigen.tuxfamily.org/dox/pages.html본 논문 의 많은 사례 도 이러한 도움말 문서 에서 직접 발췌 한 것 이다.
그리고 Eigen 에 관 한 포럼 은 방문 할 수 있 습 니 다.http://forum.kde.org/viewforum.php?f=74
Eigen 은 사용자 에 게 원본 코드 로 제공 되 며 사용 시 Eigen 의 헤더 파일 만 포함 하면 사용 할 수 있 습 니 다.
이러한 방식 을 사용 하 는 이 유 는 Eigen 이 템 플 릿 방식 으로 이 루어 지기 때 문 입 니 다. 템 플 릿 함수 가 분리 컴 파일 을 지원 하지 않 기 때문에 동적 라 이브 러 리 가 아 닌 소스 코드 만 제공 하여 사용자 가 사용 할 수 있 습 니 다. 그러나 이것 도 사용자 가 사용 하고 연구 할 수 있 습 니 다.템 플 릿 의 분리 컴 파일 이 지원 되 지 않 는 더 많은 내용 을 참고 하 십시오.http://blog.csdn.net/hjx_1000/article/details/8093701
1、 행렬 의 정의
Eigen 에서 행렬 류 에 관 한 템 플 릿 함수 에는 모두 6 개의 템 플 릿 매개 변수 가 있 지만 현재 자주 사용 하 는 것 은 앞의 세 개 뿐 입 니 다. 다음 과 같 습 니 다.
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
.......
그 앞의 세 개의 매개 변 수 는 각각 행렬 요소 의 유형, 줄 수 와 열 수 를 나타 낸다.
행렬 을 정의 할 때 Dynamic 을 사용 하여 행렬 의 행렬 수 를 알 수 없 음 으로 표시 할 수 있 습 니 다. 예 를 들 어:
typedef Matrix
Eigen 에서 도 흔히 볼 수 있 는 간단 한 정의 형식 을 제공 했다. 예 를 들 어:
typedef Matrix< double , 3 , 1> Vector3d
주의:
(1) Eigen 에 서 는 행렬 이 든 배열 이 든 벡터 든 정적 행렬 이 든 동적 행렬 이 든 모두 기본 구조 함 수 를 제공 합 니 다. 즉, 이러한 데이터 구 조 를 정의 할 때 어떠한 매개 변 수 를 제공 하지 않 아 도 되 고 그 크기 는 실행 할 때 확인 할 수 있 습 니 다.
(2) 행렬 의 구조 함수 에서 행렬 수, 요소 유형의 구조 적 매개 변수 만 제공 하고 요소 값 의 구 조 를 제공 하지 않 으 며 비교적 작고 고정된 길이 의 벡터 에 대해 초기 화 요소 의 정 의 를 제공한다. 예 를 들 어:
Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);
2. 동적 매트릭스 와 정적 매트릭스
동적 행렬 이란 크기 가 실 행 될 때 확인 되 는 것 을 말 하 며 정적 행렬 은 크기 가 컴 파일 할 때 확인 되 는 것 을 말 하 며 Eigen 에 서 는 행렬 이 라 고 부 르 지 않 습 니 다.구체 적 으로 다음 과 같은 두 단락 의 코드 를 볼 수 있다.
코드 세그먼트 1:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
cout << "m =" << endl << m << endl;
VectorXd v(3);
v << 1, 2, 3;
cout << "m * v =" << endl << m * v << endl;
}
코드 세그먼트 2:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
Matrix3d m = Matrix3d::Random();
m = (m + Matrix3d::Constant(1.2)) * 50;
cout << "m =" << endl << m << endl;
Vector3d v(1,2,3);
cout << "m * v =" << endl << m * v << endl;
}
설명:
1) 코드 세그먼트 1 에서 MatrixXd 는 임의의 크기 의 요소 유형 이 double 인 행렬 변 수 를 나타 내 는데 그 크기 는 실행 할 때 할당 되 어야 만 알 수 있 습 니 다. MatrixXd:: Random (3, 3) 은 하나의 요소 유형 이 double 인 3 * 3 의 임시 행렬 대상 을 만 드 는 것 을 나타 낸다.
2) 코드 세그먼트 2 에서 Matrix3d 는 요소 유형 이 double 크기 가 3 * 3 인 매트릭스 변 수 를 나타 내 는데 그 크기 는 컴 파일 할 때 알 수 있다.
3) 상례 에서 벡터 의 정의 도 유사 하지만, 이 벡터 의 경우 열 이 우선 이 고, Eigen 에서 줄 이 우선 인 행렬 은 이름 에 row 가 포함 되 어 있 으 며, 그렇지 않 으 면 열 이 우선 입 니 다.
4) 벡터 는 특수 한 행렬 일 뿐, 하나의 차원 은 1 일 뿐이다. 예 를 들 어 type: def Matrix < double, 3, 1 > Vector3d
3. 매트릭스 요소 의 접근
행렬 의 방문 에서 줄 색인 은 항상 첫 번 째 매개 변수 로 서 Eigen 에서 여러분 의 습관 에 따라 행렬, 배열, 벡터 의 아래 표 시 를 0 에서 시작 하도록 주의해 야 합 니 다.행렬 요소 의 접근 은 () 연산 자 를 통 해 이 루어 질 수 있 습 니 다. 예 를 들 어 m (2, 3) 는 행렬 m 의 두 번 째 줄 세 번 째 열 요 소 를 가 져 오 는 것 입 니 다 (행렬 수 는 0 부터 주의 하 십시오).다음 코드 를 참조 할 수 있 습 니 다:
출력 결 과 는 다음 과 같다.
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << "Here is the matrix m:
" << m << std::endl;
VectorXd v(2);
v(0) = 4;
v(1) = v(0) - 1;
std::cout << "Here is the vector v:
" << v << std::endl;
}
벡터 에 대해 [] 연산 자 를 제공 합 니 다. 행렬 은 이렇게 사용 할 수 없습니다. 이 유 는 C + 에서 m [i, j] 에서 쉼표 표현 식 'i, j' 의 값 은 항상 'j' 의 값 입 니 다. 즉, m [i, j] 는 C + + 에 있어 m [j] 입 니 다.
4. 행렬 을 설정 하 는 요소
Eigen 에 "< <" 연산 자 를 다시 불 러 왔 습 니 다. 이 연산 자 를 통 해 하나의 요소 로 할당 할 수도 있 고 하나씩 할당 할 수도 있 습 니 다.또한 아래 표 시 를 사용 하여 복사 할 수 있 습 니 다. 예 를 들 어 아래 두 단락 의 코드:
코드 세그먼트 1
Here is the matrix m:
3 -1
2.5 1.5
Here is the vector v:
4
3
출력 결 과 는:
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
코드 세그먼트 2 (아래 표 시 를 사용 하여 복사)
1 2 3
4 5 6
7 8 9
5. 행렬 크기 초기 화
현재 행렬 의 줄 수, 열 수, 크기 는 rows (), cols () 와 size () 를 통 해 얻 을 수 있 으 며, 동적 행렬 에 대해 서 는 resize () 함수 로 행렬 의 크기 를 동적 으로 수정 할 수 있 습 니 다.
주의:
(1) 고정 크기 의 행렬 은 resize () 를 사용 하여 행렬 의 크기 를 수정 할 수 없습니다.
(2) resize () 함 수 는 원래 의 데 이 터 를 분석 하여 구성 하기 때문에 resize () 함 수 를 호출 한 후에 요소 의 값 이 변 하지 않 는 다 는 것 을 보증 할 수 없습니다.
(3) "=" 연산 자 를 사용 하여 동적 행렬 을 조작 할 때 좌우 변 의 행렬 크기 가 다 르 면 왼쪽 의 동적 행렬 크기 는 오른쪽 크기 로 변 경 됩 니 다.예 를 들 어 다음 코드 세그먼트:
출력 결 과 는:
VectorXf m_Vector_A;
MatrixXf m_matrix_B;
int m_iN =-1;
bool InitData(int pSrc[100][100], int iWidth, int iHeight)
{
if (NULL == pSrc || iWidth <=0 || iHeight <= 0)
return false;
m_iN = iWidth*iHeight;
VectorXf tmp_A(m_iN);
MatrixXf tmp_B(m_iN, 5);
int i =0, j=0, iPos =0;
while(i<iWidth)
{
j=0;
while(j<iHeight)
{
tmp_A(iPos) = pSrc[i][j] * log((float)pSrc[i][j]);
tmp_B(iPos,0) = pSrc[i][j] ;
tmp_B(iPos,1) = pSrc[i][j] * i;
tmp_B(iPos,2) = pSrc[i][j] * j;
tmp_B(iPos,3) = pSrc[i][j] * i * i;
tmp_B(iPos,4) = pSrc[i][j] * j * j;
++iPos;
++j;
}
++i;
}
m_Vector_A = tmp_A;
m_matrix_B = tmp_B;
}
6. 어떻게 동적 행렬 과 정적 행렬 을 선택 합 니까?
Eigen 은 이 문제 에 대한 답 은 작은 행렬 (일반 크기 가 16 보다 작 음) 에 대해 고정 크기 의 정적 행렬 을 사용 하면 비교적 높 은 효율 을 가 져 올 수 있 고 큰 행렬 (일반 크기 가 32 보다 크 면) 에 대해 동적 행렬 을 사용 하 는 것 을 권장 합 니 다.
특히 주의해 야 할 것 은 매우 큰 행렬 이 고정 크기 의 정적 행렬 을 사용 하면 스 택 이 넘 치 는 문 제 를 일 으 킬 수 있다 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.