2017-03-06 76 views
1

A爲具有[m x n]元素的矩陣和B另一個具有[m x n x o]元素的矩陣。 是否有任何線性代數方式添加這兩個矩陣,C = A + B其中C將在[m x n x o]沒有任何類型的循環沿o維?添加兩個不同維度的矩陣

實施例:

A =

1  2  5  6 
1  2  3  4 
1  5  8  9 

B(:,:,1)=

1  1  1  1 
1  1  1  1 
1  1  1  1 

B(:,: ,2)=

1  1  1  1 
1  1  1  1 
1  1  1  1 

B(:,:,3)=

1  1  1  1 
1  1  1  1 
1  1  1  1 

C = A + B

C(:,:,1)=

2  3  6  7 
2  3  4  5 
2  6  9 10 

C(: 2:=

2  3  6  7 
2  3  4  5 
2  6  9 10 

C(:,:3)=

2  3  6  7 
2  3  4  5 
2  6  9 10 
+0

輸出應該是什麼樣子? –

+0

請舉個例子。 – timgeb

+2

這是MATLAB還是python? –

回答

4

這在Numpy中很容易做到:它會自動爲您擴展A.

import numpy as np 

a = np.array([[1, 2, 5, 6], [1, 2, 3, 4], [1, 5, 8, 9]]) 
print(a, end='\n\n') 

b = np.ones((3, 3, 4), dtype='int32') 
print(b, end='\n\n') 

c = b + a 
print(c) 

輸出

[[1 2 5 6] 
[1 2 3 4] 
[1 5 8 9]] 

[[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]] 

[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]] 

[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]]] 

[[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]] 

[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]] 

[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]]] 

有關numpy的如何處理不同形狀的組合陣列請參閱NumPy的Broadcasting文檔的細節。


該代碼會工作,不管什麼b內容是,我只是用一些的陣列來匹配您的樣本數據。然而,如果你只想c是通過擴展a創建的m×n×o矩陣,然後向所有元素添加一個,你甚至不需要創建b;你可以這樣做,而不是:

c = np.tile(a, (3, 1, 1)) + 1 
0

您可以添加它們,說明缺失(o)維度的位置。這裏的一個python例如使用numpy陣列:

import numpy as np 

>> arr_a = np.random.rand(2, 2) 
array([[ 0.461715 , 0.57055533], 
    [ 0.16992256, 0.93994827]]) 

>> arr_b = np.random.rand(2, 2, 2) 
array([[[ 0.71475233, 0.26140088], 
    [ 0.1469756 , 0.20147053]], 

    [[ 0.18321165, 0.46292277], 
    [ 0.07598337, 0.51653255]]]) 
# First generating an array with dimension [m * n * o], quickest to directly copy arr_b 
>> arr_c = arr_b.copy() 
# Placing array a in the zeroth column of the third dimension 
>> arr_c[:, :, 0] += arr_a 
array([[[ 1.17646733, 0.26140088], 
    [ 0.71753093, 0.20147053]], 

    [[ 0.35313422, 0.46292277], 
    [ 1.01593163, 0.51653255]]]) 
5

在MATLAB中這可以通過使用隱式膨脹(R2016b以後)或bsxfun(@plus,...)來完成。

下將在所有最近的MATLAB版本一起使用:

C = bsxfun(@plus,A,B); 

在NumPy的,這種行爲被稱爲 「廣播」。

0

由於開發金正日指出,對於MATLAB的最佳解決方案是:(2016B)使用隱式擴張(C=A+B),或(2016a及以上)使用bsxfun(@plus,A,B)。但是,如果你是MATLAB新手,那麼如何使用bsxfun可能很難掌握。第三個解決方案是簡單(我)在概念上理解,但效率較低的計算是使用repmat到矩陣A擴展到矩陣B的大小

C = repmat(A,[1,1,o]) + B 

注意,使用bsxfun或隱式膨脹優於使用repmat來提高計算效率;我只是指出這個選項,因爲我在開始使用MATLAB時無法理解bsxfun。