我对自己是否做对了有疑问。我有一个 C++ 代码,每当计数器增加时,它都会检查某个项目是否在另一个项目的半径内。此计数器用于序列中的拆分。下面的 C++ 代码用于说明。
int s = 0;
int r=200;
for( int i = 0; i<A.size();++i){
for( int j = 0; j<P.size();++j){
if( fRadius(r,P[j],A[i] ) != OUTSIDE)
++s;
}
}
float f = 1000.0/s;
在 Latex 中我写道:
fCountRadius(A,P) = \frac{1000}{\sum_{m=1}^{size(A)} \ 1 \ \forall \ fRadius(r,A_m,\{ P_1,P_2,\dots, P_{size(P)} \}) \neq OUTSIDE}
清楚吗?数学正确吗?还有更好的选择吗?
答案1
我想将其转化为指示函数的双重求和。因此,可能类似于:
\documentclass{article}
% To make the output fit in the allowed size for TeX.SX:
\usepackage[paperwidth=10cm]{geometry}
\usepackage{mathtools}
\usepackage{unicode-math}
\DeclareRobustCommand\arr[1]{\symbf{#1}}
\DeclareRobustCommand\fRadius{\operatorname{fRadius}}
\DeclareRobustCommand\OUTSIDE{\mathop{\text{\textsc{outside}}}}
\DeclareRobustCommand\ICr{I_{C_r}}
\begin{document}
\begin{align*}
r &= 200 \\
\ICr(x, y) &= \begin{cases}
0 &\text{ if } \fRadius (r, x, y)
\text{ is } \OUTSIDE \\
1 &\text{ otherwise}
\end{cases} \\
s &= \sum_{a \in \arr{A}} \sum_{p \in \arr{P}} \ICr(p, a) \\
f &= \frac{1000}{s}
\end{align*}
\end{document}
大多数 C++ 编译器在转换为静态单赋值时,都会以完全相同的方式重构源代码,作为优化过程中的一个步骤。在这种情况下,这些新函数被称为 phi 函数,如果您需要为它们制定一个通用的命名方案,您可以选择φ₁($\phi_1$
)等
如果您发现该描述清晰,您甚至可以让您的原始程序看起来更像它。GodBolt 上的所有现代编译器都能够矢量化此代码,以及您编写的代码。
#include <vector>
using Collection = std::vector<int>;
static inline bool fRadius( const int r, const int p, const int a )
{
return r*r >= p*p + a*a;
}
static inline int indicator_C_r ( const int p, const int a )
{
constexpr int r = 200;
return fRadius( r, p, a ) ? 1 : 0;
}
double fCountRadius( const Collection& A, const Collection& P )
{
int s = 0;
for ( const auto a : A )
for ( const auto p : P )
s += indicator_C_r( p, a );
return 1000.0 / s;
}
当然还有很多替代方案。一个简洁的常用符号是:定义坐标对的大小‖(p,a)‖,通过规范定义圆内的点集(或袋子,如果可以有重复项),并取其基数。
\documentclass[varwidth]{standalone}
\usepackage{mathtools}
\usepackage{unicode-math}
\begin{document}
\( \left\lvert \left\{
(p, a) \in P \times A
: \lVert (p, a) \rVert \leq r
\right\}\right\rvert
\)
\end{document}