我是这样理解的。 很高兴被纠正,希望这有助于。
假设你有一个2×3元素的matrixM. 这显然有两个维度。
我可以看到Matlab和Python之间没有区别,而要求沿着matrix已经有的维度来操作inputmatrix。 因此这两个命令
repmat(M,m,n) % matlab np.tile(M,(m,n)) # python
对于等级2的matrix(二维)是非常等价的。
当你要求重复/平铺超过inputmatrix的维数时,事情就会变得反直觉。 回到等级2的matrixM并形成2×3,看看输出matrix的大小/形状会发生什么变化就足够了。 说操纵的顺序现在是1,1,2。
在Matlab中
> size(repmat(M,1,1,2)) ans = 2 3 2
它复制了inputmatrix的前两个维(行和列),并将其重复一次到新的第三维(复制两次,即)。 真正的重复matrix的命名repmat 。
在Python中
>>> np.tile(M,(1,1,2)).shape (1, 2, 6)
它已经应用了不同的程序,因为我猜测,序列(1,1,2)的读取方式与Matlab中的不同。 正在从右向左读取列,行和面外尺寸方向的副本数量。 生成的对象与Matlab有不同的形状。 人们不能断言repmat和tile是等效的指令。
为了让tile像repmat一样工作,在Python中必须确保inputmatrix具有与序列中元素一样多的维度。 例如,通过一些预处理和创build相关对象N来完成
N = M[:,:,np.newaxis]
那么,在input端有一个N.shape = (2,3,1)而不是M.shape = (2,3) ,在输出端
>>> np.tile(N,(1,1,2)).shape (2, 3, 2)
这是size(repmat(M,1,1,2))的答案size(repmat(M,1,1,2)) 。 我认为这是因为我们已经引导了Python将第三维添加到(2,3)的右边,而不是左边,这样Python就可以像Matlab中那样计算出序列(1,1,2)阅读的方式。
在N的Python答案[:,:,0]中的元素将包含与元素(:,:,1)相同的值。
最后,当我使用Kronecker产品时,似乎无法findrepmat的等价物
>>> np.kron(np.ones((1,1,2)),M).shape (1, 2, 6)
除非我如上所述将M预处理成N。 所以我认为最常用的方法是使用np.newaxis的方法。
当我们考虑秩3(三维)的matrixL和在输出matrix中没有添加新维度的简单情况时,游戏变得棘手。 这两个看似等价的指令不会产生相同的结果
repmat(L,p,q,r) % matlab np.tile(L,(p,q,r)) # python
因为Matlab中的行,列,面外方向是(p,q,r),而在Python中是(q,r,p),这在rank-2数组中是不可见的。 在那里,人们必须小心,获得相同的结果与两种语言将需要更多的预处理。
我知道这个推理可能不是一般的,但是我可以把它解决这个问题。 希望这会引起其他研究人员的更大的考验。