本文整理汇总了C#中Matrix.Rank方法的典型用法代码示例。如果您正苦于以下问题:C# Matrix.Rank方法的具体用法?C# Matrix.Rank怎么用?C# Matrix.Rank使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix
的用法示例。
在下文中一共展示了Matrix.Rank方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Simple
public void Simple()
{
var matrix = new Matrix(4, 4);
// [ 2, 4, 1, 3 ]
// [-1, -2, 1, 0 ]
// [ 0, 0, 2, 2 ]
// [ 3, 6, 2, 5 ]
// rank 2
matrix[0, 0] = 2;
matrix[0, 1] = 4;
matrix[0, 2] = 1;
matrix[0, 3] = 3;
matrix[1, 0] = -1;
matrix[1, 1] = -2;
matrix[1, 2] = 1;
matrix[1, 3] = 0;
matrix[2, 0] = 0;
matrix[2, 1] = 0;
matrix[2, 2] = 2;
matrix[2, 3] = 2;
matrix[3, 0] = 3;
matrix[3, 1] = 6;
matrix[3, 2] = 2;
matrix[3, 3] = 5;
Assert.AreEqual(2, matrix.Rank());
}
示例2: CreateEpiGeometry_Normalized
public void CreateEpiGeometry_Normalized()
{
var ChL = new DenseVector(4);
_C_L.CopySubVectorTo(ChL, 0, 0, 3);
ChL[3] = 1.0;
var ChR = new DenseVector(4);
_C_R.CopySubVectorTo(ChR, 0, 0, 3);
ChR[3] = 1.0;
// Find e_R = P_R*C_L, e_L = P_L*C_R
_epi_R = _CMN_R * (_Nr * ChL);
_epi_L = _CMN_L * (_Nr * ChR);
_epi_R.DivideThis(_epi_R[2]);
_epi_L.DivideThis(_epi_L[2]);
_epiX_L = new DenseMatrix(3, 3);
_epiX_L[0, 0] = 0.0;
_epiX_L[1, 0] = _epi_L[2];
_epiX_L[2, 0] = -_epi_L[1];
_epiX_L[0, 1] = -_epi_L[2];
_epiX_L[1, 1] = 0.0;
_epiX_L[2, 1] = _epi_L[0];
_epiX_L[0, 2] = _epi_L[1];
_epiX_L[1, 2] = -_epi_L[0];
_epiX_L[2, 2] = 0.0;
_epiX_R = new DenseMatrix(3, 3);
_epiX_R[0, 0] = 0.0;
_epiX_R[1, 0] = _epi_R[2];
_epiX_R[2, 0] = -_epi_R[1];
_epiX_R[0, 1] = -_epi_R[2];
_epiX_R[1, 1] = 0.0;
_epiX_R[2, 1] = _epi_R[0];
_epiX_R[0, 2] = _epi_R[1];
_epiX_R[1, 2] = -_epi_R[0];
_epiX_R[2, 2] = 0.0;
// F = [er]x * Pr * pseudoinv(Pl)
_F = _epiX_R * (_CMN_R * _CMN_L.PseudoInverse());
int rank = _F.Rank();
if(rank == 3)
{
// Need to ensure rank 2, so set smallest singular value to 0
var svd = _F.Svd();
var E = svd.W;
E[2, 2] = 0;
var oldF = _F;
_F = svd.U * E * svd.VT;
var diff = _F - oldF; // Difference should be very small if all is correct
}
// Scale F, so that F33 = 1
_F = _F.Divide(_F[2, 2]);
}
示例3: Rank
public int Rank()
{
if (IsReducedRowEchelon())
{
int nonZeroRows = 0;
for (int i = 0; i < Height; i++)
{
if (!this[i].IsZero()) nonZeroRows++;
else break;
}
//should be the same as Image().Dimension and Kernel().Dimension - math!
return nonZeroRows;
}
else
{
Matrix temp = new Matrix(this);
temp.GaussJordanEliminate();
return temp.Rank();
}
}
示例4: ComputeEssentialFundamental
private void ComputeEssentialFundamental()
{
if(!IsCamLeftCalibrated || !IsCamRightCalibrated)
return;
// Find e_R = P_R*C_L, e_L = P_L*C_R
_epiPoleRight = _camRight * new DenseVector(new double[] { _translationLeft.At(0), _translationLeft.At(1), _translationLeft.At(2), 1.0 });
_epiPoleLeft = _camLeft * new DenseVector(new double[] { _translationRight.At(0), _translationRight.At(1), _translationRight.At(2), 1.0 });
_epiLeftInInfinity = false;
_epiRightInInfinity = false;
// Check if any epipole is in infinity:
if(Math.Abs(_epiPoleLeft.At(2)) < 1e-9)
{
_epiLeftInInfinity = true;
// Normalize epipole not by dividing by w, but so |e| = 1
_epiPoleLeft = _epiPoleLeft.Normalize(2);
}
if(Math.Abs(_epiPoleRight.At(2)) < 1e-9)
{
_epiRightInInfinity = true;
// Normalize epipole not by dividing by w, but so |e| = 1
_epiPoleRight = _epiPoleRight.Normalize(2);
}
// | 0 -e3 e2|
// Find [e]x = | e3 0 -e1|
// |-e2 e1 0|
_epiCrossRight = new DenseMatrix(3, 3);
_epiCrossRight[0, 0] = 0.0;
_epiCrossRight[1, 0] = _epiPoleRight[2];
_epiCrossRight[2, 0] = -_epiPoleRight[1];
_epiCrossRight[0, 1] = -_epiPoleRight[2];
_epiCrossRight[1, 1] = 0.0;
_epiCrossRight[2, 1] = _epiPoleRight[0];
_epiCrossRight[0, 2] = _epiPoleRight[1];
_epiCrossRight[1, 2] = -_epiPoleRight[0];
_epiCrossRight[2, 2] = 0.0;
_epiCrossLeft = new DenseMatrix(3, 3);
_epiCrossLeft[0, 0] = 0.0;
_epiCrossLeft[1, 0] = _epiPoleLeft[2];
_epiCrossLeft[2, 0] = -_epiPoleLeft[1];
_epiCrossLeft[0, 1] = -_epiPoleLeft[2];
_epiCrossLeft[1, 1] = 0.0;
_epiCrossLeft[2, 1] = _epiPoleLeft[0];
_epiCrossLeft[0, 2] = _epiPoleLeft[1];
_epiCrossLeft[1, 2] = -_epiPoleLeft[0];
_epiCrossLeft[2, 2] = 0.0;
// F = [er]x * Pr * pseudoinv(Pl)
_fundamental = _epiCrossRight * _camRight * (_camLeft.PseudoInverse());
int rank = _fundamental.Rank();
if(rank == 3)
{
// Need to ensure rank 2, so set smallest singular value to 0
var svd = _fundamental.Svd();
var E = svd.W;
E[2, 2] = 0;
var oldF = _fundamental;
_fundamental = svd.U * E * svd.VT;
var diff = _fundamental - oldF; // Difference should be very small if all is correct
// NOPE
// Get new SVD -> last singular value should be 0
// Vectors corresponding to this value are right/left epipoles (change them to ensure e'^TFe = 0)
// var evd = _fundamental.Evd();
// svd = _fundamental.Svd();
}
// Scale F, so that F33 = 1
_fundamental = _fundamental.Divide(_fundamental[2, 2]);
// E = Kr^T F Kl
_essential = _calibrationRight.Transpose() * _fundamental * _calibrationLeft;
}