这里您可以找到如何计算和打印二项分布的表格。我想删除那些由于概率太小(<=0.0000)而全部为空的行。
我使用了上述问题的答案(见这里)。然后我添加了一个新的\mySAVETable
。借助该etoolbox
包(答案中已经使用过),我尝试仅保存至少包含一个概率的行。我还引入了一个新的计数器来计算空单元格的数量。幸运的是,这一切都很好。但是,取消所有空行失败了。我得到的是一张空桌子,只打印了头部和脚部。
有人能帮我找出我做错的地方吗?谢谢!
这是我的代码:
\documentclass[]{article}
\usepackage{amsmath}
\usepackage[margin=.5cm, showframe=true]{geometry}
\usepackage{booktabs}
\usepackage{pgf,pgffor}
\usepackage{etoolbox}
\usepgflibrary{fpu}
\pgfkeys{/pgf/fpu}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
\pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=4}
%%% Defining basic stuff
\def\myHeadList{0.05, 0.10, 1/6, 0.20, 0.25, 0.30, 1/3, 0.40, 0.45, 0.50}
\def\myFootList{0.95, 0.90, 5/6, 0.80, 0.75, 0.70, 2/3, 0.60, 0.55, 0.50}
\newcounter{EmptyCells}
\setcounter{EmptyCells}{0}
%\def\startN{9}
%\def\endN{10}
\newif\ifsomanyzeroesshouldbeprinted
\newcommand*{\binomTable}[3][0]{% #1 = 0 => results in the form 0.0000 are typeset
% #1 != 0 => results in the form 0.0000 are omitted
% #2 = startN
% #3 = endN
\edef\startN{#2}%
\edef\endN{#3}%
\expandafter\ifnum#1=0\relax%
\somanyzeroesshouldbeprintedtrue%
\else%
\somanyzeroesshouldbeprintedfalse%
\fi%
%
%%% Building head of table
\def\myHead{ $n$ & $k$}%
\foreach \p in \myHeadList {%
\xappto\myHead{& {$\p$}}%
}%
\appto\myHead{& $k$ & EmptyCells\\}%
%
%%% Building foot of table
\def\myFoot{ $n$ & $k$}%
\foreach \p in \myFootList {%
\xappto\myFoot{& {$\p$}}%
}%
\appto\myFoot{& $k$ & EmptyCells\\}%
%
%%% Bulding body of table
\def\myTable{}%
\def\mySAVETable{}%
\def\myN{\startN,...,\endN}%
\foreach \n in \myN {%
\foreach \k in {0,...,\n}{%
\setcounter{EmptyCells}{0}
\ifnum\k=0\relax%
\xappto\myTable{\noexpand\midrule\n}%
\fi%
\xappto\myTable{& \k}%
\pgfmathsetmacro{\binomProduct}{1}%
\xdef\myTempValue{\binomProduct}%
\ifnum\k=0\relax%
\xdef\oldK{\k}%
\else%
\foreach \j in {1,...,\k}{%
\pgfmathsetmacro{\binomProduct}{\myTempValue*(\n+1-\j)/\j}%
\xdef\myTempValue{\binomProduct}%
}%
\fi%
\pgfmathsetmacro{\myTempValue}{round(\myTempValue)}%
% \xappto\myTable{& \noexpand\pgfmathprintnumber[/pgf/number format/.cd,fixed,precision=0,set thousands separator={\,},min exponent for 1000 sep=4]{\myTempValue}}%
\foreach \p in \myHeadList {%
\pgfmathsetmacro{\result}{\myTempValue*\p^(\k)*(1-\p)^(\n-\k)}%
\ifsomanyzeroesshouldbeprinted%
\xappto\myTable{& \noexpand\pgfmathprintnumber[skip 0.=true, dec sep={}]{\result}}%
\else%
\ifdim\result pt<0.00005pt\relax%
\gappto\myTable{&}%
\addtocounter{EmptyCells}{1}
\else%
\xappto\myTable{& \noexpand\pgfmathprintnumber[skip 0.=true, dec sep={}]{\result}}%
\fi%
\fi%
}%
\pgfmathsetmacro{\result}{\n-\k}%
\xappto\myTable{& \noexpand\pgfmathprintnumber[/pgf/number format/.cd,fixed,precision=0,set thousands separator={\,},min exponent for 1000 sep=4]{\result} & \arabic{EmptyCells}}%
\gappto\myTable{\\}%
\ifnum\arabic{EmptyCells}=10%
\else%
\appto\mySAVETable{\myTable}%
\fi%
}%
}%
}
\pagestyle{empty}
\begin{document}
\binomTable[1]{15}{17}
\begin{tabular}{rrr*{10}{r}r}
\toprule\myHead\mySAVETable\midrule\myFoot\bottomrule
\end{tabular}
\end{document}
答案1
这是一个基于 LuaLaTeX 的解决方案。原帖者表示他/她会使用基于 pdfLaTeX 的解决方案;不幸的是,我不知道如何创建这样的解决方案。 :-( 希望我的回答将来对其他读者有用。
二项式概率是针对各种n
、k
(0\le k\le n
) 值以及在和p
之间均匀分布的10 个概率计算的。 下面显示的主 Lua 函数通过三个嵌套循环执行工作:范围从到、范围从到和范围从到。二项式概率四舍五入到小数点后 4 位。 为了满足您的主要格式要求,它们显示为小于 0.5e-4 的值。(就我个人而言,我发现浏览具有大量单元格的表格比浏览具有大量完全空白单元格的表格更容易。)此外,如果可以使用少于 4 位数字显示概率,程序将省略尾随零。 例如,对于和,在下面显示的第一个屏幕截图中,概率显示为、和。同样,对于和,概率显示为、和。0.05
0.50
for
n
2
n_max
k
0
n
p
0.05
0.50
0
0
n=2
p=0.1
0.81
0.18
0.01
k=0,1,2
n=2
p=0.5
0.25
0.5
0.25
k=0,1,2
下面显示的代码创建了一个longtable
大约横跨 2-1/2 页的页面。屏幕截图取自页面的顶部和底部longtable
。
\documentclass{article}
\usepackage[a4paper,margin=2.3cm]{geometry} % choose suitable page parameters
\usepackage{longtable,booktabs,array}
\usepackage{luacode}
\begin{luacode}
-- utility functions to round numbers to a preset number of digits
function round2int ( x )
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end
function round ( num , digits )
return round2int ( num * 10^digits ) / 10^digits
end
-- print the header row of the binomial probabilities table
function make_header_row ()
for p=1,10 do
tex.sprint ( "{"..string.format("%.2f",p/20) .. "}" )
if p<10 then tex.sprint ("&") end
end
end
-- functions to compute factorials, # of permutations, and binom. probabilities
function factorial ( t )
if t==0 or t==1 then return 1
else return ( t * factorial(t-1) )
end
end
function perm ( n , k ) -- 0 \le k \le n
return ( factorial(n) / (factorial(n-k)*factorial(k) ) )
end
function prob ( n , k , p )
return ( p^k * (1-p)^(n-k) * perm(n,k) )
end
-- The main Lua function:
function create_binom_table ( nmax )
for n = 2 , nmax do
tex.sprint ( n )
for k = 0 , n do
tex.sprint ( "&" .. k .. "&" )
for p = 1,10 do
-- round result to four digits
px = round ( prob ( n, k , p/20 ) , 4 )
tex.sprint ( string.format("%.4g", px ) )
if p < 10 then tex.sprint ( "&" ) end
end
tex.sprint ( "\\\\" )
end
if n < nmax then
tex.sprint ("\\addlinespace")
end
end
end
\end{luacode}
\begin{document}
\begin{longtable}{@{} rr *{10}{l} @{}}
\toprule
$n$ & $k$ & \multicolumn{10}{c@{}}{$p$}\\
\cmidrule(l){3-12}
& & \directlua{make_header_row ()} \\ % create header row
\midrule
\endhead
\midrule
\multicolumn{12}{r@{}}{\footnotesize(Continued on next page)}\\
\endfoot
\bottomrule
\endlastfoot
% call the main Lua function, with n=2 until n=15
\directlua{create_binom_table ( 15 )}
\end{longtable}
\end{document}
附录:我刚刚注意到,虽然 OP 的代码设置为形成一个包含 10 个成功概率的表格,范围从 到0.05
,0.5
但这些概率并不是均匀分布的。调整上述代码来处理这种情况并不困难。
在 Lua 代码块顶部附近插入以下指令:
-- vector of success probabilities pvec={0.05,0.1,1/6,0.2,0.25,0.3,1/3,0.4,0.45,0.5}
在函数中
make_header_row
,更改行tex.sprint ( "{"..string.format("%.2f",p/20) .. "}" )
到
tex.sprint ( "{"..string.format("%.4g",pvec[p]) .. "}" )
在函数中
create_binom_table
,更改行px = round ( prob ( n, k , p/20 ) , 4 )
到
px = round ( prob ( n, k , pvec[p] ) , 4 )
其余部分可以保持不变。