0

我正在嘗試編寫代碼來獲取矢量的「N維產品」。例如,如果我有2個長度爲L的向量,那麼'2維產品'就是正規向量乘積,R = x * y',這樣每個R,R(i, j)是x的第i個元素和y的第j個元素的乘積,也就是R(i,j)= x(i)* y(j)。獲取矢量的N維產品

問題是如何在matlab中對任意維度進行優雅地概括。這是我有3個向量,x,y,z,我想要三維數組R,使得R(i,j,k)= x(i)* y(j)* z(k)。 (i1,i2,i3,i4)= x1(i1)* x2(i2)* x3(i3)* x4(i4)等等4個向量,x1,x2,x3,x4 ...

此外,我不知道維數預先。該代碼必須能夠處理任意數量的輸入向量,並且輸入向量的數量對應於最終答案的維數。

有沒有什麼簡單的matlab技巧來做到這一點,並避免特意通過R的每個元素?

謝謝!

+0

啊,我現在看到你的編輯關於不知道維數。我會更新我的答案。 – Nigel

回答

1

內置函數bsxfun是一個應該能夠幫助的快速實用程序。它被設計爲針對具有不匹配尺寸的兩個輸入以每個元素爲基礎執行2個輸入功能。單身人士尺寸被擴大,並且非單身人士尺寸需要匹配。 (這聽起來令人困惑,但一旦grok'd在很多方面有用)。

正如我理解你的問題,你可以調整每個向量的維度形狀來定義它應該定義的維度。然後使用嵌套的bsxfun調用來執行乘法。

實施例的代碼如下:

%Some inputs, N-by-1 vectors 
x = [1; 3; 9]; 
y = [1; 2; 4]; 
z = [1; 5]; 

%The computation you describe, using nested BSXFUN calls 
bsxfun(@times, bsxfun(@times, ... %Nested BSX fun calls, 1 per dimension 
    x, ...       % First argument, in dimension 1 
    permute(y,2:-1:1)) , ...  % Second argument, permuited to dimension 2 
    permute(z,3:-1:1))   % Third argument, permuted to dimension 3 

%Result 
% ans(:,:,1) = 
%  1  2  4 
%  3  6 12 
%  9 18 36 
% ans(:,:,2) = 
%  5 10 20 
%  15 30 60 
%  45 90 180 

爲了處理尺寸的任意數量,這可以通過使用一個遞歸或循環結構進行擴展。循環看起來是這樣的:

allInputs = {[1; 3; 9], [1; 2; 4], [1; 5]}; 

accumulatedResult = allInputs {1}; 
for ix = 2:length(allInputs) 
    accumulatedResult = bsxfun(@times, ... 
     accumulatedResult, ... 
     permute(allInputs{ix},ix:-1:1)); 
end 
+0

謝謝追求。這非常有幫助,但仍然不是全部。我不知道預先確定的維數(它是一個參數),那麼如何修改任意N維的代碼呢? – DankMasterDan

+0

請參閱編輯循環實現。這讓我想起了一個類似的問題(但非常類似的問題):http://stackoverflow.com/a/9337114/931379 – Pursuit

3

我認爲「正規矢量產品」是指外部產品。

在任何情況下,您都可以使用ndgrid函數。我比使用bsxfun更喜歡這個,因爲它更簡單一點。

% make some vectors 
w = 1:10; 
x = w+1; 
y = x+1; 
z = y+1; 

vecs = {w,x,y,z}; 

nvecs = length(vecs); 

[grids{1:nvecs}] = ndgrid(vecs{:}); 

R = grids{1}; 
for i=2:nvecs 
    R = R .* grids{i}; 
end; 

% Check results 
for i=1:10 
    for j=1:10 
     for k=1:10 
      for l=1:10 
       V(i,j,k,l) = R(i,j,k,l) == w(i)*x(j)*y(k)*z(l); 
      end; 
     end; 
    end; 
end; 

all(V(:)) 

    ans = 1 
+0

嗨Nigel。謝謝!事實上,我事先不知道尺寸(只是編輯了問題)。 – DankMasterDan

+0

我用更一般的版本編輯。只要你有一個單元陣列與你的載體,它應該工作。 – Nigel