2013-09-22 90 views
2

我有三個時間序列數組a,b,c,每個數組由1000個值組成。他們組成一個矩陣A.乘以彼此的向量陣列

現在,我想要採取每個數組,並逐點乘以它到每一個其他數組,所以我會得到9個新的向量a^2,ab,ac,ba,b^2,bc ,ca,cb,cc。

當我這樣做時,我想將這9個新陣列合併爲81個新陣列。

我該怎麼做?就像我說的,我試圖建立一個矩陣,但它並不像我想要的那樣工作。我希望A被識別爲1×3矩陣,並且包含1000×1陣列。現在它只是連接一切。如果A是含陣列1×3的矩陣,我可以只建立矩陣B =轉置(A)* A,其中將包括所有產品

我已經試過像

A = [[a] [b] [c]] 

A = {a b c} 

A = {a; b; c} 
defining a, b and c as a = {1, 2, 5, 2 , 1 ...} instead of [1, 2, 5, 2 , 1 ...] 

但沒有東西他們的作品。

我不在乎a,b,c,d是以列表,列數組,行數組還是單元格的形式存儲的,而且我在matlab中確實不夠好,無法知道所有的subtile差異,但速度內存性能是一個問題。

+0

在矩陣運算符之前放置一個點「。」以使其成爲元素明確的,例如, 'a。^ 2','a。* b'。 –

+0

對不起,但我想要數組相乘,而不是自己。也許我不清楚,但我正在尋找某種自動的方式來組合陣列。實際上,我會有三個以上的信號,可能有數百個信號,所以如果每個組合都寫出來就太乏味了。 我想按照元素的方式進行計算,但首先我希望將數組組合爲「矩陣式」。 – user1661303

+0

理想情況下,我想有一個矩陣,其行爲與矩陣完全一樣,除了它具有數組(或列表或向量)作爲條目並且+和*被重載的情況下 如果我可以進行矩陣乘法這樣A * B的第一個條目就是a11 * b12 + a12 * b21,其中a11等於是一個向量,a11 * b12是分段相乘 – user1661303

回答

3

此問題減少到創建索引對。

%Simulate random data 
X=rand(1000,3); 

%Create index multiplication pairs 
[i,j] = meshgrid(1:size(X,2),1:size(X,2)) 

%Multiply together 
X = X(:,i(:)).*X(:,j(:)); 

在這種情況下,你會得到下面的列對相乘

[i(:)';j(:)'] = 
1  1  1  2  2  2  3  3  3 
1  2  3  1  2  3  1  2  3 

您可以重複這一過程,以remultiply。但要小心:矩陣大小將在迭代次數中呈指數增長。

+0

謝謝,這似乎正是我想要的。我不知道最後一行發生了什麼,但它的工作原理。 有什麼辦法解決上述問題,讓矩陣在數組而不是數字上工作? (我沒有創建一個新的問題,因爲它有點相關)。 – user1661303

+0

@ user1661303如果滿足您的初始問題,請將其標記爲正確答案。關於你的第二個問題:你需要重新解釋你的問題,因爲我不清楚你的意思。標記爲 – twerdster

+0

。另一個問題是在最初的帖子中,這就是爲什麼我沒有把它標記爲已解決。我希望矩陣表現爲1 * 3矩陣,只有3個條目不應該是數字,而是數組,即我想封裝數組。但也許它太模糊了。明天將會發佈一個關於它的新問題。 – user1661303

3

你可以這樣做,如下所示。由於函數bsxfunpermute對於Matlab初學者來說可能並不明顯,所以我建議你根據需要查看他們的文檔(參見上面的鏈接)。

給定三個數據向量abc,步驟如下:

A = [ a(:) b(:) c(:) ]; % matrix from column vectors 
P = bsxfun(@times,A,permute(A,[1 3 2])); % desired result 

結果P是1000x3x3陣列,其中包含所需產物。第二個和第三個索引P以明顯的方式解釋:1對應於a,2至b和3至c。例如,P(10,1,2)a(10)*b(10); P(50,3,3)c(50)^2;等等。

要迭代:簡單地reshapeP到一個新的矩陣A2和重複過程:

A2 = reshape(P,[1000,9,1]); 
P2 = bsxfun(@times,A2,permute(A2,[1 3 2])); % result 

這給出結果的1000x9x9陣列P2英寸