【发布时间】:2018-04-16 09:25:40
【问题描述】:
我正在尝试将 Matlab 脚本翻译成 Numpy。这是 Matlab 代码的一部分:
function [idx,D]=knnsearch(varargin)
[N,M] = size(Q);
L=size(R,1);
idx = zeros(N,K);
D = idx;
for k=1:N
d=zeros(L,1);
for t=1:M
d=d+(R(:,t)-Q(k,t)).^2;
end
d(k)=inf;
[D(k),idx(k)]=min(d);
end
其中Q 和R 是可以考虑的矩阵,例如如eye(5);你可以考虑K = 1。一个示例函数调用可能是:
Q = eye(5);
R = eye(5);
[idx,D] = knnsearch(Q,R,1);
返回:
idx:
2
1
1
1
1
D:
2
2
2
2
2
这是 Numpy 代码:
import numpy as np
def knnsearch(Q, R, K):
(N,M) = Q.shape
L = len(R[:,1])
idx = np.zeros((N,K), dtype=int)
D = np.copy(idx)
for k in range(0, N):
d = np.zeros((L, 1))
for t in range(0, M):
d = d + (R[:,t] - Q[k,t])**2
d[k] = np.inf
idx[k] = np.argmin(d)
D[k] = np.amin(d)
return (idx, D)
在哪里
Q0 = np.identity(5)
R0 = np.identity(5)
idxout, Dout = knnsearch(Q0, R0, 1)
这与 Matlab 的返回不同:
idx:
[[5]
[1]
[2]
[3]
[4]]
D:
[[0]
[0]
[0]
[0]
[0]]
行号 9 存在问题。行的第二部分,标量 ((R(:,t)-Q(k,t)).^2),为 Matlab 和 Numpy 返回相同的值。相反,加法 (d + 标量) 返回不同的值。因此,矩阵d 在 Matlab 和 Numpy 中包含不同的值。
提前致谢。
【问题讨论】:
-
这只能用minimal reproducible example来回答
-
好的,我已经更新了问题,现在代码完成了
-
这样的问题应该包括一个小的可重复数据集和你想要的数据集...
-
@spookyisland 这无疑是不完整的,因为我无法复制粘贴它并在不制作数据的情况下运行它。