str*_*out 7 python matlab vectorization
我正在尝试将这行代码从Python翻译成MATLAB:
new_img[M[0, :] - corners[0][0], M[1, :] - corners[1][0], :] = img[T[0, :], T[1, :], :]
Run Code Online (Sandbox Code Playgroud)
所以,当然,我写了这样的东西:
new_img(M(1,:)-corners(2,1),M(2,:)-corners(2,2),:) = img(T(1,:),T(2,:),:);
Run Code Online (Sandbox Code Playgroud)
但是当它到达那一行时它会给我以下错误:
请求的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])
Run Code Online (Sandbox Code Playgroud)
它的解释如下:
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)
...
...
...
Run Code Online (Sandbox Code Playgroud)
相反,我希望它被解释为:
A(2,1) = B(1,2)
A(3,3) = B(2,4)
A(5,5) = B(3,6)
Run Code Online (Sandbox Code Playgroud)
当你A[vector1, vector2]在Python中,你索引集:
A[vector1[0], vector2[0]]
A[vector1[1], vector2[1]]
A[vector1[2], vector2[2]]
A[vector1[3], vector2[3]]
...
Run Code Online (Sandbox Code Playgroud)
在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))
...
Run Code Online (Sandbox Code Playgroud)
也就是说,您获得了每个指数组合.您应该将其视为由两个向量中指定的行和列组成的子数组.
要完成与Python代码相同的操作,您需要使用线性索引:
index = sub2ind(size(A), vector1, vector2);
A(index)
Run Code Online (Sandbox Code Playgroud)
因此,您的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);
Run Code Online (Sandbox Code Playgroud)
中间块在这里做的是沿第三维添加相同元素的线性索引.If ii是第一个通道中元素的线性索引,则ii + offset1是第二个通道中ii + 2*offset1相同元素的索引,并且是第三个通道中相同元素的索引,等等.所以这里我们为所有生成索引那些矩阵元素.该+操作正在进行隐式单例扩展(他们称之为Python中的"广播").如果你有MATLAB的旧版本,这将失败,你需要更换A+B有bsxfun(@plus,A,B).
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |