【问题标题】:Matlab to Numpy translation - matrix + scalar differencesMatlab 到 Numpy 的翻译 - 矩阵 + 标量差异
【发布时间】: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

其中QR 是可以考虑的矩阵,例如如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 这无疑是不完整的,因为我无法复制粘贴它并在不制作数据的情况下运行它。

标签: python matlab numpy


【解决方案1】:

问题是 Python 中的(R[:,t] - Q[k,t])**2 创建了一个长度为 5 的列表,但您需要的是一个维度为 5x1 的数组。要得到这个,你只需要更换

d = d + (R[:,t] - Q[k,t])**2

ma = (R[:,t] - Q[k,t])**2
ma.shape += (1,)
d = d + ma

然后你得到预期的输出:

idx: 
[[1]
 [0]
 [0]
 [0]
 [0]]
D:
[[2]
 [2]
 [2]
 [2]
 [2]]

【讨论】:

  • 谢谢,现在可以使用了!!感谢您编辑和改进我的问题
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多