Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab到python的代码转换_Python_Matlab - Fatal编程技术网

matlab到python的代码转换

matlab到python的代码转换,python,matlab,Python,Matlab,我正在将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

我正在将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


如何将其正确转换为python?

使用numpy时,最好将所有数组初始化为numpy数组,而不是python数组(列表列表),然后在执行时转换为numpy。因此,对于第一步,我将输入
v=np.zero(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_

第一个问题是,在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.sqrt
np.norm
,而不是
sqrt
norm
什么样的问题?首先,您没有在
曲线的任意位置定义initialize
v
,这可能会导致问题。与
L
相同。如果
v
是一个数组,你应该使用
*
,而不是
np.dot
,如果
v
是一个矩阵,你应该使用
np.multiply
(因为你想要
*
,这是元素乘法,而不是矩阵乘法)。@ShinTakezou:我不明白np.sum(v.np.dot(v))是怎么做的)是否可以在python中工作?我认为您需要将
v.np.dot
更改为
v.dot
>>> np.sum([[5,5,5],[5,5,5]], axis=0)
array([10, 10, 10])