fix: range auto

This commit is contained in:
liuyihui 2022-07-04 23:48:30 +08:00
parent eafef1fd61
commit f0df27ef9b
3 changed files with 38 additions and 36 deletions

BIN
Figure_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -368,8 +368,9 @@ void CMainFrame::OnOptOpen() {
// 其他设置 // 其他设置
m_bClearFlag = TRUE; m_bClearFlag = TRUE;
pView->m_sRangeMode = "Auto"; OnRangeAuto();
pView->m_sSmoothType = "Origin"; pView->m_sSmoothType = "Origin";
UpdateValue(); UpdateValue();
pDoc->UpdateAllViews(NULL); pDoc->UpdateAllViews(NULL);
} }
@ -519,8 +520,8 @@ void CMainFrame::OnAxisLog() {
if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView));
pView->m_sAxisMode = (CString)"Log"; pView->m_sAxisMode = (CString)"Log";
pView->m_sRangeMode = "Auto";
pView->m_ComboAxis.SetCurSel(1); pView->m_ComboAxis.SetCurSel(1);
OnRangeAuto();
m_bAutoFlag = FALSE; m_bAutoFlag = FALSE;
m_bLinearFlag = TRUE; m_bLinearFlag = TRUE;
m_bLogFlag = FALSE; m_bLogFlag = FALSE;
@ -538,6 +539,7 @@ void CMainFrame::OnRangeAuto() {
pView->m_sRangeMode = (CString)"Auto"; pView->m_sRangeMode = (CString)"Auto";
m_bAutoFlag = FALSE; m_bAutoFlag = FALSE;
pView->m_nLC = max(1, RoundupPowerof2(pView->m_nMaxCount)); pView->m_nLC = max(1, RoundupPowerof2(pView->m_nMaxCount));
pView->UpdateData(FALSE);
pDoc->UpdateAllViews(NULL); pDoc->UpdateAllViews(NULL);
} }
@ -550,7 +552,7 @@ void CMainFrame::OnRangeD4() {
if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView));
pView->m_sRangeMode = (CString)"Manual"; pView->m_sRangeMode = (CString)"Manual";
pView->m_nLC /= 4; pView->m_nLC = pView->m_nLC > 1 ? pView->m_nLC / 4 : 1;
m_bAutoFlag = TRUE; m_bAutoFlag = TRUE;
pView->UpdateData(FALSE); pView->UpdateData(FALSE);
pDoc->UpdateAllViews(NULL); pDoc->UpdateAllViews(NULL);
@ -561,7 +563,7 @@ void CMainFrame::OnRangeD2() {
if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); if (pView == nullptr) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView));
pView->m_sRangeMode = (CString)"Manual"; pView->m_sRangeMode = (CString)"Manual";
pView->m_nLC /= 2; pView->m_nLC = pView->m_nLC > 1 ? pView->m_nLC / 2: 1;
m_bAutoFlag = TRUE; m_bAutoFlag = TRUE;
pView->UpdateData(FALSE); pView->UpdateData(FALSE);
pDoc->UpdateAllViews(NULL); pDoc->UpdateAllViews(NULL);

View File

@ -1,10 +1,10 @@
#pragma once #pragma once
#ifndef DESCSS_Matrix_h #ifndef Matrix_h
#define DESCSS_Matrix_h #define Matrix_h
#include <iostream> #include <iostream>
#define swap2(x, y) ((x)=(x)^(y),(y)=(x)^(y),(x)=(x)^(y)) #define swap2(x, y) ((x) = (x) ^ (y), (y) = (x) ^ (y), (x) = (x) ^ (y))
class matrix { class matrix {
public: public:
@ -71,15 +71,9 @@ void matrix::Input(double* p) {
for (int j = 0; j < m; j++) this->element[i][j] = *(p++); for (int j = 0; j < m; j++) this->element[i][j] = *(p++);
} }
void matrix::Output() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) std::cout << element[i][j] << " ";
std::cout << std::endl;
}
}
double& matrix::operator()(int i, int j) const { double& matrix::operator()(int i, int j) const {
if (i < 0 || i > n - 1 || j < 0 || j > m - 1) std::cout << "Matrix Index Out Of Bounds " << std::endl; if (i < 0 || i > n - 1 || j < 0 || j > m - 1)
std::cout << "Matrix Index Out Of Bounds " << std::endl;
return element[i][j]; return element[i][j];
} }
@ -123,15 +117,22 @@ matrix matrix::operator/(const double& C) const {
return w; return w;
} }
BOOL LUPDescomposition(matrix mA, matrix& mL, matrix& mU, int* P) std::ostream& operator<<(std::ostream& cout, matrix& mA) {
{ for (int i = 0; i < mA.rows(); i++) {
for (int j = 0; j < mA.cols(); j++) cout << mA(i, j) << " ";
if (i < mA.rows() - 1) cout << std::endl;
}
return cout;
}
bool LUPDescomposition(matrix mA, matrix& mL, matrix& mU, int* P) {
int n = mA.rows(); int n = mA.rows();
int row = 0, tmp; int row = 0, tmp;
double L, U, tmp2; double L, U, tmp2;
for (int i = 0; i < n; i++) P[i] = i; for (int i = 0; i < n; i++) P[i] = i;
for (int i = 0; i < n - 1; i++) { for (int i = 0; i < n - 1; i++) {
tmp2 = 0.; tmp2 = 0.;
for(int j = i; j < n; j++) for (int j = i; j < n; j++)
if (std::abs(mA(j, i)) > tmp2) { if (std::abs(mA(j, i)) > tmp2) {
tmp2 = std::abs(mA(j, i)); tmp2 = std::abs(mA(j, i));
row = j; row = j;
@ -144,23 +145,21 @@ BOOL LUPDescomposition(matrix mA, matrix& mL, matrix& mU, int* P)
tmp = P[i], P[i] = P[row], P[row] = tmp; tmp = P[i], P[i] = P[row], P[row] = tmp;
for (int j = 0; j < n; j++) for (int j = 0; j < n; j++) tmp2 = mA(i, j), mA(i, j) = mA(row, j), mA(row, j) = tmp2;
tmp2 = mA(i, j), mA(i, j) = mA(row, j), mA(row, j) = tmp2;
U = mA(i, i), L = 0; U = mA(i, i), L = 0;
for (int j = i + 1; j < n; j++) { for (int j = i + 1; j < n; j++) {
L = mA(j, i) / U; L = mA(j, i) / U;
mA(j, i) = L; mA(j, i) = L;
for (int k = i + 1; k < n; k++) for (int k = i + 1; k < n; k++) mA(j, k) = mA(j, k) - mA(i, k) * L;
mA(j, k) = mA(j, k) - mA(i, k) * L;
} }
} }
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
mL(i, i) = 1; mL(i, i) = 1;
for (int j = 0; j < i; j++) mL(i, j) = mA(i, j); for (int j = 0; j < i; j++) mL(i, j) = mA(i, j);
for (int j = i; j < n; j++) mU(i, j) = mA(i, j); for (int j = i; j < n; j++) mU(i, j) = mA(i, j);
} }
return TRUE; return true;
} }
matrix LUPSolve(matrix& mL, matrix& mU, int* P, double* b) { matrix LUPSolve(matrix& mL, matrix& mU, int* P, double* b) {
@ -170,12 +169,12 @@ matrix LUPSolve(matrix& mL, matrix& mU, int* P, double* b) {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
y[i] = b[P[i]]; y[i] = b[P[i]];
for (int j = 0; j < i; j++) y[i] -= mL(i, j) * y[j]; for (int j = 0; j < i; j++) y[i] -= mL(i, j) * y[j];
} }
for (int i = n - 1; i >= 0; i--) { for (int i = n - 1; i >= 0; i--) {
mX(i, 0) = y[i]; mX(i, 0) = y[i];
for (int j = n - 1; j > i; j--) mX(i, 0) -= mU(i, j) * mX(j, 0); for (int j = n - 1; j > i; j--) mX(i, 0) -= mU(i, j) * mX(j, 0);
mX(i, 0) /= mU(i, i); mX(i, 0) /= mU(i, i);
} }
@ -198,15 +197,15 @@ matrix matrix::I() {
} }
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) mMir.element[i][j] = element[i][j]; for (int j = 0; j < m; j++) mMir.element[i][j] = element[i][j];
LUPDescomposition(mMir, mL, mU, P); LUPDescomposition(mMir, mL, mU, P);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) b[j] = 0; for (int j = 0; j < n; j++) b[j] = 0;
b[i] = 1; b[i] = 1;
mX = LUPSolve(mL, mU, P, b); mX = LUPSolve(mL, mU, P, b);
for (int j = 0; j < n; j++) mInv(j, i) = mX(j, 0); for (int j = 0; j < n; j++) mInv(j, i) = mX(j, 0);
} }
return mInv; return mInv;
} }
@ -219,16 +218,17 @@ matrix matrix::T() {
return w; return w;
} }
double Gaussian(double x, double A, double mean, double sigma) { double Gaussian_(double x, double A, double mean, double sigma) {
return A * exp(-(x - mean) * (x - mean) / (2 * sigma * sigma)); return A * exp(-(x - mean) * (x - mean) / (2 * sigma * sigma));
} }
matrix Jacobian(int n, double* X, double A, double mean, double sigma) { matrix GaussianJacobian_(int n, double* X, double A, double mean, double sigma) {
matrix J(n, 3); matrix J(n, 3);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
J(i, 0) = -Gaussian(X[i], A, mean, sigma) / A; J(i, 0) = -Gaussian_(X[i], A, mean, sigma) / A;
J(i, 1) = -(X[i] - mean) * Gaussian(X[i], A, mean, sigma) / (sigma * sigma); J(i, 1) = -(X[i] - mean) * Gaussian_(X[i], A, mean, sigma) / (sigma * sigma);
J(i, 2) = -(X[i] - mean) * (X[i] - mean) * Gaussian(X[i], A, mean, sigma) / (sigma * sigma * sigma); J(i, 2) = -(X[i] - mean) * (X[i] - mean) * Gaussian_(X[i], A, mean, sigma) /
(sigma * sigma * sigma);
} }
return J; return J;
} }