在MATLAB中进行这种Python矢量化赋值的等效方法是什么



我正试图将这行代码从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,:),:);

但当它到达那条线时,它给了我以下错误:

请求的106275x106275x3(252.4GB(阵列超过了最大阵列大小偏爱创建大于此限制的数组可能需要很长时间时间并导致MATLAB变得没有响应。请参阅阵列大小限制或首选项面板以获取更多信息。

这让我相信它没有正确分配任务。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]时,您会对集合进行索引:

A[vector1[0], vector2[0]]
A[vector1[1], vector2[1]]
A[vector1[2], vector2[2]]
A[vector1[3], vector2[3]]
...

在MATLAB中,类似的A(vector1, vector2)对集合进行索引:

A(vector1(1), vector2(1))
A(vector1(1), vector2(2))
A(vector1(1), vector2(3))
A(vector1(1), vector2(4))
...
A(vector1(2), vector2(1))
A(vector1(2), vector2(2))
A(vector1(2), vector2(3))
A(vector1(2), vector2(4))
...

也就是说,你得到了每个指数的组合。您应该将其视为由两个向量中指定的行和列组成的子数组。

为了实现与Python代码相同的功能,您需要使用线性索引:

index = sub2ind(size(A), vector1, vector2);
A(index)

因此,你的MATLAB代码应该做:

index1 = sub2ind(size(new_img), M(1,:)-corners(2,1), M(2,:)-corners(2,2));
index2 = sub2ind(size(img), T(1,:), T(2,:));
% these indices are for first 2 dims only, need to index in 3rd dim also:
offset1 = size(new_img,1) * size(new_img,2);
offset2 = size(img,1) * size(img,2);
index1 = index1.' + offset1 * (0:size(new_img,3)-1);
index2 = index2.' + offset2 * (0:size(new_img,3)-1);
new_img(index1) = img(index2);

中间块在这里所做的是为沿着第三维度的相同元素添加线性索引。如果ii是第一个通道中元素的线性索引,那么ii + offset1是第二个通道中同一元素的索引,ii + 2*offset1是第三个通道中相同元素的索引等等。所以这里我们生成所有这些矩阵元素的索引。+操作正在进行隐式单例扩展(在Python中称之为"广播"(。如果你有一个旧版本的MATLAB,这将失败,你需要用bsxfun(@plus,A,B)替换A+B

相关内容

  • 没有找到相关文章

最新更新