【发布时间】:2020-09-05 00:16:09
【问题描述】:
我正在将正交匹配追踪算法从 MATLAB 转录到 Python,但我在代码的特定部分遇到了问题。
Matlab 代码为:
indx=zeros(L,1);
for j=1:1:L
proj=D'*residual;
[maxVal,pos]=max(abs(proj));
pos=pos(1);
indx(j)=pos;
a=pinv(D(:,indx(1:j)))*x;
residual=x-D(:,indx(1:j))*a;
到目前为止,我对 Python 的了解是:
indx = np.zeros([L,], dtype=int)
for j in range(L):
proj = D.T @ resid
maxVal, pos = np.amax(np.absolute(proj)), np.argmax(np.absolute(proj), axis = 0)
indx[j] = pos
d = D[:, indx[j]]
a = np.linalg.pinv(d) @ x # take pseudo-inverse of array D and matrix multiply by x
resid = np.subtract(x, d * a)
我的问题始于无法像在 MATLAB 中那样在 Python 中创建大小未定的空数组。例如,对于 MATLAB 如何在 Python 或 Numpy 中创建空数组 (a = []),我还没有找到令人满意的复制。目前,我在提供的代码上方将a 初始化为a = []。我认为这是另一回事,但在这种情况下,一个解决方案将在以后对我有所帮助。
稍微描述一下代码在 MATLAB 中的作用,L = 2,所以如果 j = 1 用于第一次迭代,D(:,indx(1:j)) 将是一个 34x1 矩阵,列 indx(1)(可以是 1 中的任何整数到 80(含)填充 34 行。下一次迭代将是从 D 中选择的另一列,这将使D(:,indx(1:j)) 成为一个 34x2 矩阵,两列都完好无损。
为了清楚起见,我在 python 版本中将切片分成变量d。目前,它会在第二次迭代中使用来自indx 的新编号覆盖先前选择的列。我真的不知道从这里去哪里。我尝试了几种不同的切片方式,但都没有奏效。我最接近得到我想要的东西是设置indx = np.zeros([L,], dtype=int)和d = D[:,indx[j]],它给出indx.shape = (2,),但是因为0是Python中的索引,第一次迭代选择了D的第0列,所以我得到了34x2 数组,但有一个过早选择/添加的列。如果我执行 d = D[:, indx[0:j]],我会得到一个空的 34x0 数组,用于 d。
【问题讨论】:
-
python 中的典型切片
x:y:i运行为x、x+i、...、y-1。所以你需要写d = D[:, indx[0:j+1]]来实现你所描述的。 -
@amzon-ex 做到了。我知道我已经尝试过了,但我可能没有用
indx = np.zeros([L,], dtype=int)尝试过。它可能设置为indx = np.zeros([L,1], dtype=int),这给了我d.shape = (34, 2, 1)。我来到这里是因为我在这个问题上工作太久了,我知道我错过了一些简单的东西。感谢您的帮助。
标签: python arrays matlab numpy machine-learning