2013-08-02 306 views
1

我是新來的matlab,只是想知道如果你們可以幫我解決這個問題。Matlab矩陣尺寸

舉例來說,我有兩個矩陣:

A = [X1 X2 X3 X4] 

B = [Y1; Y2; Y3] 

現在我真正想要實現的是通過這種方式來相乘這兩個矩陣:

[X1Y1 X2Y1 X3Y1 X4Y1; 
X1Y2 X2Y2 X3Y2 X4Y2; 
X1Y3 X2Y3 X3Y3 X4Y3; 
.... and so on] 

我嘗試使用A(1,:).*B(:,1)但MATLAB是說矩陣尺寸必須一致。

我只是不知道如何操作這個matlab,但在Excel中是可能的。

+0

你試過從右乘以A嗎? B()。A() –

回答

3

這是一個簡單的外部產品。 kron是不需要的(雖然它會起作用)。bsxfun是瘋狂的矯枉過正,雖然會產生你所要求的。 repmat是不合適的,因爲雖然它可以幫助你做你想做的事,但它會在內存中複製數組,使用比所需更多的資源。 (避免使用低效的編程風格,當有好的編程風格立即在您的處置。)

所有你需要使用的是簡單的*運算符。

A是一個行向量。 B列向量。

C = B*A 

將產生結果C(i,j)= B(i)* A(j),這正是你正在尋找的。請注意,這是有效的,因爲B是3x1而A是1x4,所以B和A的「內部」尺寸符合。

在MATLAB中,如果您不確定是否有用,請嘗試!

A = [1 2 3 4]; 
B = [1;2;3]; 
C = B*A 
ans = 
    1  2  3  4 
    2  4  6  8 
    3  6  9 12 

請參閱KRON確實工作,但我敢打賭使用KRON這裏可能是低效率比單純外積的乘法。

C = kron(B,A) 
C = 
    1  2  3  4 
    2  4  6  8 
    3  6  9 12 

同時,bsxfun將在這裏工作過,但因爲我們使用的是通用的工具做一些基本的操作者會做,我打賭這是略少效率。

C = bsxfun(@times,B,A) 
C = 
    1  2  3  4 
    2  4  6  8 
    3  6  9 12 

最糟糕的選擇是repmat。再一次,因爲它人爲地將載體複製到記憶體FIRST中,所以在大載體的情況下它必須出去並抓住大塊的記憶。

C = repmat(B,1,4).*repmat(A,3,1) 
C = 
    1  2  3  4 
    2  4  6  8 
    3  6  9 12 

我想完整性,你也可以使用meshgrid或ndgrid。看到它正在做repmat做的,但是在這裏它明確地創建了新的矩陣。再次,當有好的工具來完成你想要的工作時,這是一種糟糕的編程風格。

[BB,AA] = ndgrid(B,A) 
BB = 
    1  1  1  1 
    2  2  2  2 
    3  3  3  3 
AA = 
    1  2  3  4 
    1  2  3  4 
    1  2  3  4 

C = BB.*AA 
C = 
    1  2  3  4 
    2  4  6  8 
    3  6  9 12 

你需要了解的是究竟爲什麼這些工具可能已經用於作業,以及爲什麼它們是不同的。

+0

+1,特別是對於聲明*在MATLAB中,如果您不確定某些方面是否有效,請嘗試!* SO似乎被那些寧願花費20分鐘撰寫問題和花費數小時等待答案而不是花費的人所淹沒20分鐘左右玩耍並找出自己的答案。 –

-1

我認爲你只需要轉置矢量之一。您正在將列向量(A(1,:))與行向量(B(:,1))相乘。這應該工作:

C = A(1,:).*B(:,1)'; 
+0

你可以通過一行和一列的元素乘法來實現一個元素,Matlab不介意(我認爲,我實際上並不是100%,而不是圍繞matlab來測試。廣播,所以不能用它來檢查)。但在這種情況下,問題是'A'有4個元素,而'B'只有3個.OP後面的是傳統矩陣乘法,即'B * A' – Dan

+1

我實際上在matlab會話(2010A)並在嘗試執行A(1,:)。* B(:,1)時發生錯誤。但你是對的,看來OP的意思是別的:) – roger

1

在Matlab中有*.*和他們有很大的不同。

*是正常的矩陣乘法,這是你想要的,即B*A,請注意B必須首先作爲內部維度必須匹配。你可以乘一列乘一列,但不乘一列乘一列(除非他們有相同數量的元素)。如果[1 2 3]。* [4 5 6] = [1 * 4 2 * 5 3 * 6],則矩陣必須是完全相同的大小和形狀。 = [4 10 18]

+0

爲什麼downvote?我的回答是正確的! – Dan

+0

困了downvote刪除。 – 2013-08-02 10:13:37

+0

@HighPerformanceMark不,你絕對不能。試試這個:A = [1,2,3,4]; B = [1; 2; 3]; A * B;'你會得到錯誤*內矩陣維度必須一致*但是B * A '會運行良好。這是因爲在第二種情況下,內部尺寸都是1,但在第一種情況下,您正嘗試乘以4x3,這是您通過定義矩陣乘法無法實現的。 – Dan

0

不要做「.*」。你應該做一個「*」。 「.*」是索引乘以索引,並且應該給你[X1Y1 X2Y2 X3Y3]它們的向量大小是否相同。 如果您執行常規乘法「*」,這實際上是矩陣乘法。