我正在努力向量化一個函式,該函式在兩個向量 x = 2xN 和 v = 2xM 之間執行一些成對的差異,對于一些任意的 N,M。當 N = 1 時我有這個作業,雖然,我想向量化這個函式適用于任意 N 的輸入。
事實上,我想要這個函式做的是為 x 的每一列找到 x(:,column) (a 2x1) 和 v (a 2xM) 之間的規范差。
一個類似的帖子是this,雖然我無法概括它。
當前實施
function mat = vecDiff(x,v)
diffVec = bsxfun(@minus, x, v);
mat = diffVec ./ vecnorm(diffVec);
例子
x =
1
1
v =
1 3 5
2 4 6
----
vecDiff(x,v) =
0 -0.5547 -0.6247
-1.0000 -0.8321 -0.7809
uj5u.com熱心網友回復:
您的方法可以進行如下調整以滿足您的需求:
- 置換
x
其中一個或的維度v
,使其列數成為第三個維度。我v
在下面的代碼中進行選擇。 - 這使您可以利用隱式擴展(或等效地
bsxfun
)來計算2
×M
×N
差異陣列,其中M
和是和N
的列數。x
v
- 計算沿第一個維度的向量 (2-) 范數,并再次使用隱式擴展來規范化該陣列:
x = [1 4 2 -1; 1 5 3 -2];
v = [1 3 5; 2 4 6];
diffVec = x - permute(v, [1 3 2]);
diffVec = diffVec./vecnorm(diffVec, 2, 1);
permute
如果您希望輸出的尺寸以其他順序排列,您可能需要以不同的方式應用。
uj5u.com熱心網友回復:
假設您的兩個輸入矩陣是 A(一個 2 x N 矩陣)和 B(一個 2 x M 矩陣),其中每一列代表一個不同的觀察值(請注意,這不是表示資料的傳統方式)。
請注意,輸出的大小為 N x M x 2。
out = zeros(N, M, 2);
我們可以使用內置函式找到它們之間的距離pdist2
。
dists = pdist2(A.', B.');
(具有矩陣方向所需的轉置)
要獲得單獨的 x 和 y 距離,我能想到的最簡單的方法是使用 repmat:
xdists = repmat(A(1,:).', 1, M) - repmat(B(1,:), N, 1);
ydists = repmat(A(2,:).', 1, M) - repmat(B(2,:), N, 1);
然后我們可以通過前面找到的距離對其進行歸一化:
out(:,:,1) = xdists./dists;
out(:,:,2) = ydists./dists;
這將回傳一個矩陣out
,其中位置的元素是和(i, j, :)
之間的規范距離的分量。A(:,i)
B(:,j)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/462511.html