1.Eigen的源码介绍、安装与入门操作
2.在matlab中用lu分解求逆矩阵的源码源代码
3.android Matrix.setRotate å postRotateçåºå«
4.[LaTeX 漫谈] 数学矩阵:从 TeX Primitives 到 nicematrix 宏包
Eigen的介绍、安装与入门操作
Eigen是源码一个C++的开源模板库,专用于线性代数运算,源码包括向量和矩阵操作,源码以及数值分析等。源码可可文档文库源码它以头文件形式存在,源码无需编译,源码只需在cpp文件中添加`#include "Eigen/Dense"`即可使用。源码安装与入门
在Ubuntu Server .上,源码Eigen的源码安装有两条路径:通过apt命令或手动编译。1. apt命令安装
虽然简单,源码但apt包更新较慢,源码可能不是源码最新版本,这可能影响依赖于最新Eigen的源码库的使用。检查版本的命令是:`apt-cache policy eigen`。2. 手动编译安装
从Eigen官网下载源码或使用wget,解压后进入目录,然后进行编译。如何学好java源码安装成功后,可以通过编写并运行代码验证,如`MatrixXd matrix = MatrixXd::Random(2, 2); cout << matrix << endl;`。实例演示
矩阵操作
创建一个2x2矩阵,赋值并输出,如`MatrixXd m = MatrixXd::Random(2, 2); cout << m << endl;`。矩阵与向量
定义一个3x3矩阵和3维向量,进行矩阵加常数和矩阵向量乘法,展示其运算结果。opencv3 源码总结
本文简要介绍了Eigen的基本概念、安装方法、头文件使用以及入门级的矩阵向量操作。深入学习Eigen,还有更多内容等待探索。在matlab中用lu分解求逆矩阵的源代码
function X=Ni(A)
%Input - A is an N x N matrix
%Output - I is an N x N inverse matrix of A
%and I(j,:)containing the solution to AX(:,j) =E(:,j).
%Initialize X, Y,the temporary storage matrix C, and the row
% permutation information matrix R
[N,N]=size(A);
B=eye(N); %B is an N x N identity matrix
X=zeros(N,N);
Y=zeros(N,N);
C=zeros(1,N);
R=1:N;
%the next steps is to find the factorization(factorize for only once)
for p=1:N-1
%Find the pivot row for column p
[max1, j]=max(abs(A(p:N,p)));
%Interchange row p and j
C=A(p,:);
A(p,:)=A(j+p-1,:);
A(j+p-1,:)=C;
d=R(p);
R(p)=R(j+p-1);
R(j+p-1)=d;
if A(p,p)==0
'A is singular. No unique solution'
break
end
%Calculate multiplier and place in subdiagonal portion of A
for k=p+1:N
mult=A(k,p)/A(p,p);
A(k,p) = mult;
A(k,p+1:N)=A(k,p+1:N)-mult*A(p,p+1:N);
end
end
for j=1:N
%when j is fixed then the method is similar to the Program 3.3
%Solve for Y(:,j)
Y(1,j) = B(R(1),j);
for k=2:N
Y(k,j)= B(R(k),j)-A(k,1:k-1)*Y(1:k-1,j);
end
%Solve for X(:,j)
X(N,j)=Y(N,j)/A(N,N);
for k=N-1:-1:1
X(k,j)=(Y(k,j)-A(k,k+1:N)*X(k+1:N,j))/A(k,k);
end
end
android Matrix.setRotate å postRotateçåºå«
Matrix主è¦ç¨äºå¯¹å¹³é¢è¿è¡å¹³ç§»(Translate)ï¼ç¼©æ¾(Scale)ï¼æ转(Rotate)以åæå(Skew)æä½ã
为ç®åç©éµåæ¢ï¼Androidå°è£ äºä¸ç³»åæ¹æ³æ¥è¿è¡ç©éµåæ¢ï¼å ¶ä¸å æ¬ï¼
setç³»åæ¹æ³ï¼setTranslateï¼setScaleï¼setRotateï¼setSkewï¼è®¾ç½®ï¼ä¼è¦çä¹åçåæ°ã
preç³»åæ¹æ³ï¼preTranslateï¼preScaleï¼preRotateï¼preSkewï¼ç©éµå ä¹ï¼å¦M' = M * T(dx, dy)ã
postç³»åæ¹æ³ï¼postTranslateï¼postScaleï¼postRotateï¼postSkewï¼ç©éµåä¹ï¼å¦M' = T(dx, dy) * Mã
éè¿å°åæ¢ç©éµä¸åå§ç©éµç¸ä¹æ¥è¾¾å°åæ¢çç®çï¼ä¾å¦ï¼
平移ï¼x'=x+txï¼y'=y+tyï¼ï¼
缩æ¾ï¼x'=sx*xï¼y'=sy*yï¼ï¼
æ转ï¼x'=cosβ*x-sinβ*yï¼y'=sinβ*x+cosβ*yï¼ï¼
éæ©éè¦ç¨å°å¦ä¸çä¸è§å½æ°çå ¬å¼ï¼
â sin(α+β)=sinαcosβ+cosαsinβ
â¡cos(α+β)=cosαcosβ-sinαsinβ
å ¬å¼â å¯ä»¥ç±åä½åæ¹æ³ææåå¯å®çæ¨å¯¼åºæ¥ã
æ¨å¯¼è¿ç¨åè§ï¼/s/blog_fcj.html
æåï¼x'=x+k1*yï¼y'=k2*x+yï¼ï¼
//æºç æ件ï¼external\skia\legacy\src\core\SkMatrix.cpp
#define SK_Scalar1 (1.0f)
#define kMatrixElem SK_Scalar1
typedef float SkScalar;
#define SkScalarMul(a, b) ((float)(a) * (b))
enum {
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
};
void SkMatrix::reset() {
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMTransX] = fMat[kMTransY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);
}
void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] = dx; //以æ°å¼dxè¦çåå¼ï¼åå¼æ æäº
fMat[kMTransY] = dy;
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);
} else {
this->reset();
}
}
bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->preConcat(m); //ç©éµçå ä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +
SkScalarMul(fMat[kMSkewX], dy); //å ä¹ï¼éè¦ç©éµè¿ç®è¿
fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +
SkScalarMul(fMat[kMScaleY], dy);
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->postConcat(m); //ç©éµçåä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += dx; //åä¹ï¼ç´æ¥å æ°å¼dxå³å¯
fMat[kMTransY] += dy;
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::preConcat(
[LaTeX 漫谈] 数学矩阵:从 TeX Primitives 到 nicematrix 宏包
本文深入探讨 LaTeX 矩阵的处理方式,从基础的 TeX Primitives 到进阶的 nicematrix 宏包,一步步解析矩阵在数学模式下的应用。
在数学模式下,叉叉脚本看源码矩阵是指包含多行多列内容、左右侧有可选定界符的数学式,广泛用于表示数理学科中的矩阵和行列式等数学对象。
首先,提及的是 TeX Primitives 中的 \halign、\valign 和 \noalign,它们主要用于表格和对齐操作的内部,很少直接使用。
在 Plain TeX 格式中,抻牌麻将源码提供了 \matrix、\pmatrix 和 \bordermatrix 命令,基于 TeX Primitives,它们主要用于处理矩阵。
LaTeX2e 格式在此基础上,继承了 Plain TeX 的三个命令,并加强为健壮命令,同时引入了 array 环境,其用法与 tabular 环境类似,允许用户控制列对齐。
amsmath 宏包提供了一系列矩阵环境,如 bmatrix、pmatrix 和 vmatrix,它们在数学排版中扮演重要角色。
值得注意的是,当加载 amsmath 宏包后,原 \matrix 和 \pmatrix 命令将无法使用。
当遇到标准扩展无法满足的需求时,可以寻找其他宏包和文档进行小修补和拓展,如 TikZ 宏包,它能简化某些标记需求,为矩阵绘图提供了便利。
TikZ 宏包能生成矩阵,其行列间距与 amsmath 有所不同。借助 tikzmark 宏包,可以实现矩阵单元格的相对位置标记,但这可能导致矩阵输入变得复杂。
最后推荐的 nicematrix 宏包具备多种优势,如自定义行列间距、调整矩阵外观、提供标记功能等。通过例子展示,nicematrix 宏包让矩阵处理更加直观且便捷。
示例源码可参见项目 muzimuzhi/latex-examples 中的文件 matrix-from-plaintex-to-nicematrix.*,供进一步研究和实践使用。