我正在尝试将这行代码从Python翻译成MATLAB:
new_img[M[0, :] - corners[0][0], M[1, :] - corners[1][0], :] = img[T[0, :], T[1, :], :]
所以,很自然地,我写了这样的东西:
new_img(M(1,:)-corners(2,1),M(2,:)-corners(2,2),:) = img(T(1,:),T(2,:),:);
但是当它到达那条线时,它给了我以下的错误:
Requested 106275x106275x3 (252.4GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information.
这让我相信它没有正确地分配事物。Img最多是一幅1000×1500的RGB图像。同样的代码在Python中的工作时间不到5秒。我怎样才能像MATLAB中第一行的代码那样进行向量赋值呢?你知道吗
顺便说一句,我没有粘贴我的所有代码行为这篇文章不太长。如果我还需要补充什么,请告诉我。你知道吗
编辑: 下面是我希望我的代码做什么的解释(基本上,这就是Python代码所做的):
考虑一下这行代码。这不是一个真正的MATLAB代码,我只是想解释一下我想做什么:
A([2 3 5], [1 3 5]) = B([1 2 3], [2 4 6])
其解释如下:
A(2,1) = B(1,2)
A(3,1) = B(2,2)
A(5,1) = B(3,2)
A(2,3) = B(1,4)
A(3,3) = B(2,4)
A(5,3) = B(3,4)
...
...
...
相反,我希望它被解释为:
A(2,1) = B(1,2)
A(3,3) = B(2,4)
A(5,5) = B(3,6)
在Python中执行
A[vector1, vector2]
时,将对集合进行索引:在MATLAB中,相似的
A(vector1, vector2)
代替索引集:也就是说,你可以得到每个指数的组合。您应该将其视为由两个向量中指定的行和列组成的子数组。你知道吗
要实现与Python代码相同的功能,需要使用线性索引:
因此,您的MATLAB代码应该:
中间块所做的是为第三维度的相同元素添加线性索引。如果
ii
是第一个通道中某个元素的线性索引,那么ii + offset1
是第二个通道中同一个元素的索引,ii + 2*offset1
是第三个通道中同一个元素的索引,依此类推。所以这里我们生成所有这些矩阵元素的索引。+
操作执行隐式单例扩展(在Python中称为“广播”)。如果您有一个旧版本的MATLAB,这将失败,您需要将A+B
替换为bsxfun(@plus,A,B)
。你知道吗相关问题 更多 >
编程相关推荐