2017-03-06 14 views
1

Aは、[m x n]の要素とBの要素を持つ行列になるようにします。[m x n x o]の要素を持つ別の行列です。 C = A + BここでC[m x n x o]になり、oディメンションに沿ってループが発生しないような両方の行列を追加する線形代数的方法はありますか?異なる次元の2つの行列を追加する

例:

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を展開します。異なる形状のアレイを組み合わせる方法numpyのハンドルの詳細について

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のBroadcastingドキュメントを参照してください。


コードがbの内容が何であるかに関係なく機能することは、私はちょうどあなたのサンプルデータと一致するようなものの配列を使用していました。しかし、cを、aを展開して作成したm x n x oの行列にしてから、すべての要素に1を加えただけの場合は、bも作成する必要はありません。あなたの代わりにこれを行うことができます:のDev-ILが指摘したように

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

欠落している(o)ディメンションの位置を示すだけで追加できます。 MATLABで

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

これは暗黙の膨張(R2016b以降)またはbsxfun(@plus,...)を使用して行うことができる:ここでnumpyアレイを用いpython例です。以下は、最近のすべてのMATLABのバージョンで動作します

:numpyので

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

、この動作は、 "放送" として知られています。

0

を、MATLABのための最適なソリューションは、以下のとおりです(2016B)bsxfun(@plus,A,B)を使用する暗黙の拡大(C=A+B)、または(2016aと古い)を使用します。しかし、MATLABを初めてお使いの方は、bsxfunの使い方を理解するのが難しいかもしれません。第三の概念を理解する(私用)簡単である溶液が、あまり効率的な計算は、行列Bのサイズbsxfunまたは暗黙的な拡張を使用するよりも好ましいこと

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

注に行列Aを拡大するrepmatを使用することです計算効率のためにrepmatを使用する。私はMATLABを使い始めたときにbsxfunの理解に問題があったので、このオプションを指摘しています。

関連する問題