如何将简单的MATLAB方程转换为Python?

时间:2017-01-15 17:09:31

标签: python matlab numpy

我需要了解如何翻译这几行MATLAB代码。我不了解如何创建n1n元素的向量,以及如何使用与MATLAB中相同的公式填充它。

这是MATLAB代码:

nc = 200; ncmax = 600; dx = 0.15e-04; 
r = (dx/2):dx:dx*(ncmax+3); 
n1(1:nc) =(1 ./ (s.*sqrt(2*pi).*r(1:nc))).*exp(-((log(r(1:nc)) - med).^2)./(2*s^2));

我在Python中有以下内容,但n1始终是nc个元素的空数组:

import numpy as np

r =np.arange((dx/2),(dx*(ncmax+3)),dx)
count=1
n1=np.empty(nc)

while (count<nc)

n1[count]=(1/(s*np.sqrt(2*pi)*r[count]))*np.exp(-((np.log(r[count]))-med)**2)/(2*s**2)
count=count+1

2 个答案:

答案 0 :(得分:1)

你在MATLAB中有一个漂亮的矢量化解决方案。使用NumPy的一个主要原因是它也允许矢量化 - 所以你不应该引入循环。

正如lucianopaz的评论所述,有guide to NumPy for MATLAB users解释了两者之间的差异和相似之处。它还有一个很好的MATLAB函数列表和它们的NumPy等价物。在翻译MATLAB程序时,这可能会有很大帮助。

一些提示和评论:

  • 使用所有功能的NumPy版本,即np.sqrtnp.exp(与之前一样)和np.power(而不是**)。这些函数可以以矢量化方式调用,就像在MATLAB中一样。

  • 正如@Elisha所注意到的,您错过了smed的定义,因此我们假设这些是标量,并将它们设置为{{1} }。

  • 您可以使用1 math,而不是仅为math.pi导入np.pi

  • 您正在创建一个较大的r向量,并且只使用第一个nc元素。为什么不从一开始就制作r nc尺寸import numpy as np nc = 200 ncmax = 600 dx = 0.15e-04 s = 1 med = 1 r = np.arange(dx / 2, dx * nc, dx) n1 = 1 / (s * np.sqrt(2 * np.pi) * r) * \ np.exp(-np.power(np.log(r) - med, 2) / (2 * np.power(s, 2))) ,如下所示?

产生的NumPy代码:

.btn-link, .btn-link:active, .btn-link:focus, .btn-link:hover {
    border-color: transparent;
}

答案 1 :(得分:0)

你有几个问题。

  1. pi应为math.pi(在您添加import math后)
  2. :添加到您的空行:while (count < nc):
  3. smed未在您撰写的范围内定义