簡體   English   中英

在MATLAB中進行這種類型的pythonic矢量化賦值的等效方法是什么?

[英]What is the equivalent way of doing this type of pythonic vectorized assignment in MATLAB?

我正在嘗試將這行代碼從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM