【问题标题】:code conversion from matlab to pythonmatlab到python的代码转换
【发布时间】:2014-01-09 07:41:51
【问题描述】:

我正在将 matlab 文件转换为 python 代码。我的 matlab 文件是:

function [q,len] = curve_to_q(p)

[n,N] = size(p);
for i = 1:n
    v(i,:) = gradient(p(i,:),1/(N)); 
end

len = sum(sqrt(sum(v.*v)))/N;
v = v/len;
for i = 1:N
    L(i) = sqrt(norm(v(:,i)));
    if L(i) > 0.0001
        q(:,i) = v(:,i)/L(i);
    else
        q(:,i) = v(:,i)*0.0001;
    end
end

转换后的代码是:

from __future__ import division
import numpy as np
from scipy.io import loadmat,savemat
import os

def curve_to_q(p):
    n, N = p.shape # nargout=2
    for i in range(1, (n +1)):
        v[(i -1), :] = np.gradient(p[(i -1), :], 1 / (N))
    len_ = np.sum(np.sqrt(np.sum(v.np.dot(v)))) / N
    v = v / len_
    for i in range(1, (N +1)):
        L[(i -1)] = sqrt(norm(v[:, (i -1)]))
        if L[(i -1)] > 0.0001:
            q[:, (i -1)] = v[:, (i -1)] / L[(i -1)]
        else:
            q[:, (i -1)] = v[:, (i -1)] * 0.0001
    return q, len_

但是,

好像有问题
len_ = np.sum(np.sqrt(np.sum(v.np.dot(v)))) / N

L[(i -1)] = sqrt(norm(v[:, (i -1)]))

我怎样才能使它正确转换为 python?

【问题讨论】:

  • 什么样的问题?
  • 首先,您没有在curve_to_q 的任何地方定义初始化v,这可能会导致问题。 L 也一样。如果v 是一个数组,你应该使用*,而不是np.dot,如果v 是一个矩阵,你应该使用np.multiply(因为你想要.*,这是元素乘法,不是矩阵乘法)。
  • @ShinTakezou:我无法理解 np.sum(v.np.dot(v))) 在 python 中的工作方式?
  • 我觉得你需要把v.np.dot改成v.dot

标签: python matlab


【解决方案1】:

使用 numpy,最好将所有数组初始化为 numpy 数组而不是 python 数组(列表的列表),然后在执行时转换为 numpy。所以第一步我会输入v = np.zeros(n, N) 来初始化。这应该可以解决您的第二个问题。

下一步是让您的代码更具可读性。删除 N+1/i-1 等。L 不需要是列表 - 仅使用当前值,因此将其更改为局部变量而不是列表。

在matlab中:v.*v不是点积,它是两个数组的逐元素相乘。此外,当您尝试将v 与自身进行点积时,v 不是正方形,因此它不起作用。但是,我们可以使用转置的点积来简化这一步。

下面的代码应该会有所帮助。 matlab 代码中的第一个 sum 对“第一个数组维度”求和(我忘记了这是哪一个)-因此您必须检查 v_squared_sum 在两种语言中是否具有相同的维度。

def curve_to_q(p):
    n, N = p.shape # nargout=2
    v = np.zeros((n, N))
    for i in range(n):
        v[i, :] = np.gradient(p[i, :], 1 / N)
    v_squared_sum = v.dot(v.transpose()) # 1 x (n or N) array
    len_ = np.sum(np.sqrt(v_squared_sum)) / N
    v = v / len_
    for i in range(N):
        L = sqrt(norm(v[:, i]))
            q[:, i] = v[:, i] / max(L, 0.0001)
    return q, len_

【讨论】:

    【解决方案2】:

    您的第一个问题是,在 Matlab 中,sum 默认对最后一个维度求和,而在 numpy 中,np.sum 默认对展平数组求和。

    Matlab

    >> sum([5,5,5;5,5,5])
    ans = 
        10 10 10
    

    Python:

    >>> np.sum([[5,5,5],[5,5,5]])
    30
    

    在 python 中你需要这样的东西:

    >>> np.sum([[5,5,5],[5,5,5]], axis=0)
    array([10, 10, 10])
    

    第二个问题是你需要np.sqrtnp.norm,而不是sqrtnorm

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2014-01-23
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多