我正在尝试将数学公式转换为PHP代码。
您可以在接受的答案中看到公式:Applying a Math Formula in a more elegant way (maybe a recursive call would do the trick)。
我不是一名专业的程序员,所以我尽力翻译,但我的技能有限,我遇到了一些问题。
让我们开始。
有一个包含玩家堆栈的向量:我认为二维数组应该在这里完成工作。我会添加一个键来识别每个玩家。
$array = array(1 => 2000, 3 => 5000 ...);
现在他想创建一个价值矩阵,我做了我的研究,发现了一个名为Math_Matrix的PEAR包,安装了它,但我想知道如何创建那种矩阵。
我担心我无法翻译整个代码,因为他使用了递归调用等高级方法。
你能帮帮我吗?
编辑:OLD BOUNTY REWARD
我尝试了你的建议但我觉得因为编程能力差而浪费时间。
如果有人希望通过在PHP中翻译这个公式来帮助我,那么我决定提出50小便。
请注意,如果您认为Python中的翻译更容易/更适合/其他,请提供一种方法将Python脚本包含在PHP脚本中,因为我打算在网站中使用此公式。
答案 0 :(得分:14)
你走了。
我将此代码放入公共领域。
# Function to make an array of 'width' zeros
function makerow($width){
$row=array();
for($x=0;$x<$width;$x++){
$row[$x]=0;
}
return $row;
}
# Function to make a width*height matrix
function makematrix($width,$height){
$matrix=array();
for($y=0;$y<$height;$y++){
$matrix[$y]=array();
for($x=0;$x<$width;$x++){
$matrix[$y][$x]=0;
}
}
return $matrix;
}
# Adds one matrix to another
function matrixadd(&$matrixdest,&$matrixsrc){
for($i=0;$i<count($matrixdest);$i++){
for($j=0;$j<count($matrixdest[$i]);$j++){
$matrixdest[$i][$j]+=$matrixsrc[$i][$j];
}
}
}
# Multiplies a matrix by a scalar
function matrixmultiply(&$matrix,$scalar){
for($i=0;$i<count($matrix);$i++){
for($j=0;$j<count($matrix[$i]);$j++){
$matrix[$i][$j]*=$scalar;
}
}
}
# Calculates the equity of each place. Rows indicate players;
# columns indicate places (0 is 1st place, 1 is second, and so on)
# The parameter 'places' is optional. If not given, uses the
# number of stacks.
function equitymatrix(&$stacks, $places=-1){
if($places==-1){
# replace places with the stack count
$places=count($stacks);
}
if(count($stacks)<=1){
return array(array(1));
}
$totalStacks=0;
for($i=0;$i<count($stacks);$i++){
$totalStacks+=$stacks[$i];
}
# Optimize for case where there is only one place
if($places==1){
$matrix=makematrix(1,count($stacks));
for($i=0;$i<count($stacks);$i++){
$matrix[$i][0]=$stacks[$i]*1.0/$totalStacks;
}
return $matrix;
}
# Optimize for case where there are two places
if($places==2){
$matrix=makematrix(2,count($stacks));
for($i=0;$i<count($stacks);$i++){
$matrix[$i][0]=$stacks[$i]*1.0/$totalStacks;
}
for($i=0;$i<count($stacks);$i++){
for($j=0;$j<count($stacks);$j++){
if($i!=$j){
$matrix[$i][1]+=$matrix[$j][0]*($stacks[$i]*1.0/($totalStacks-$stacks[$j]));
}
}
}
return $matrix;
}
# Calculate the probabilities of each player getting first place
$probabilities=array();
for($i=0;$i<count($stacks);$i++){
$probabilities[$i]=$stacks[$i]*1.0/$totalStacks;
}
#echo(count($stacks)." ".$places."\n");
$subequities=array();
for($i=0;$i<count($stacks);$i++){
$substacks=array();
# Assume that player i would be in first place
# Create a new array with i's stack removed
for($j=0;$j<count($stacks);$j++){
if($j!=$i){
array_push($substacks,$stacks[$j]);
}
}
# Find the subequity of the remaining players
$subequities[$i]=equitymatrix($substacks,
min($places,count($substacks)));
for($j=0;$j<count($subequities[$i]);$j++){
array_unshift($subequities[$i][$j],0);
}
# Add player i back
$newrow=makerow($places);
$newrow[0]=1;
array_splice($subequities[$i],$i,0,array($newrow));
}
$equities=makematrix($places,count($stacks));
for($i=0;$i<count($stacks);$i++){
# Multiply the probabilities
matrixmultiply($subequities[$i],$probabilities[$i]);
# Add the subequity
matrixadd($equities,$subequities[$i]);
}
return $equities;
}
示例:
$mystacks=array(10,40,30,20);
print_r(equitymatrix($mystacks));
关于矩阵的使用:
在PHP中,矩阵可以表示为数组数组。你可以看到
在函数makematrix
中,它返回一个长度为height
的数组,
每个元素都是width
个零的数组。您的问题使用以下内容
矩阵运算,两者都很简单:
matrixadd
)。在这里,只需将一个矩阵的元素添加到
另一个矩阵的相应元素。matrixmultiply
)
涉及将矩阵的每个元素乘以该数字。答案 1 :(得分:0)
我想最大的问题是你打算用它来做什么。最后我真的建议不要使用PHP。它不是为这类工作而设计的,你最终会为自己造成很多工作。
如果你只是在寻找计算方法,我建议使用Octave(MATLAB的OpenSource版本)如果你真的想围绕它构建一个程序,你应该使用NumPy模块来研究Python:{{ 3}}
如果你有能力,我建议使用mod_python来运行NumPy来处理这个问题。这可能是最简单的方法,因为NumPy可以原生地处理矩阵。除此之外,您应该查看以下用于在PHP中处理矩阵的类。有些人开发了一些专门用于操作矩阵的类。
http://numpy.scipy.org/ http://www.phpclasses.org/package/2859-PHP-Perform-operations-with-matrices.html
答案 2 :(得分:0)
如果安装了Matlab,使用符号数学工具箱,
您可以使用ccode
函数将此公式(或任何其他公式)转换为c代码(与php非常相似)。