如何在Haskell或Python中翻译这个数学公式?(已翻译成PHP)

mzsu5hc0  于 2023-03-07  发布在  PHP
关注(0)|答案(3)|浏览(95)

我正在尝试将数学公式转换为PHP代码。
您可以在此处看到公认答案中的公式:Applying a Math Formula in a more elegant way (maybe a recursive call would do the trick).
我不是一个专业的程序员,所以我尽我所能翻译,但我的技能有限,我遇到了一些问题。
我们开始吧
有一个向量包含玩家的堆栈:我认为二维数组应该完成这个工作。我会添加一个键来标识每个参与者。

$array = array(1 => 2000, 3 => 5000 ...);

现在他想创建一个矩阵的价值观,我做了我的研究,并找到了一个PEAR包称为数学矩阵,安装它,但我想知道如何创建这种矩阵。
我担心我不能翻译整个代码,因为他使用了递归调用等高级方法。
你能帮帮我吗?

  • 编辑:旧赏金 *

我尝试了你的建议,但我觉得浪费我的时间,因为我的编程技术差。
我已经决定提供50英镑,如果有人想帮助我翻译公式在PHP。
请注意,如果您认为用Python翻译更容易/更合适/其他,请提供一种方法来将Python脚本包含在PHP脚本中,因为我计划在网站中使用此公式。

hmmo2u0o

hmmo2u0o1#

给你。
我把这个代码放到公共领域。

# 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)只涉及将矩阵的每个元素乘以该数。
shstlldc

shstlldc2#

如果你安装了Matlab,用符号数学工具箱
你可以使用ccode函数来把这个公式(或者任何其他的)翻译成c代码(非常类似于php)。

slsn1g29

slsn1g293#

我想最大的问题是你打算用它来做什么。最后我真的建议不要用PHP。它不是为这种类型的工作设计的,你以后会给自己带来很多工作。
如果你只是在寻找一种计算它的方法,我推荐使用Octave(MATLAB的开源版本)。如果你真的想围绕它构建一个程序,你应该使用NumPy模块研究Python:Link
如果你有这个能力,我建议你使用mod_python来运行NumPy来处理这个问题。这可能是最简单的方法,因为NumPy本身就可以处理矩阵。除此之外,你应该看看PHP中存在的用于处理矩阵的类。一些人已经开发了一些专门用于处理矩阵的类。
http://www.phpkode.com/scripts/item/matrix-new/http://www.phpclasses.org/package/2859-PHP-Perform-operations-with-matrices.html

相关问题