2017-10-19 13 views
0

Matlabでコードを記述しようとしている方程式がありますが、コードが正しいかどうかはわかりません。以下の式のMatlab相当コード

Iの反復が上付き即ちK、+ 1等kおよび寸法は、下付き文字M、N、N」でマークされている上にあると思う

Equation

を次のように式です。表記法は文学では明確に定義されていないので、これがどのようにすべきかと思います。次のように、この方程式の

私のコードセグメントは、次のとおりです。

c_n = [1,2,3,4]';  % c^(0)_n (nx1) vector 
K = 50; 
d = [0.5,0.9]'; 

for k = 1:1:K 
c_n = c_n.*((sum(A_mn'*d/(sum(A_mn*c_n,2)),2))./sum(A_mn',2)) ; 
end 

は、このコードは、上記の式のために正しいです?。方程式の和は私を混乱させている。

+0

ダイムに関してもっと洞察が必要ですここに列挙した変数のnsionality。 'c'と' d'ベクトルはありますか? 'A'は行列ですか? – rayryeng

+0

yes「c」と「d」はベクトル、「A」は行列(mxn)です。 'A^T'は' A'の転置にすぎません。 – radk

+0

これらはすべて基本的な行列演算であり、合計の必要はありません。そのため、インデックスが転置されたばかりの「A」に対して、同じ合計ではなく、「A^T」の合計があるのです。 –

答えて

1

Am行とn列の行列である場合、和\sum_{m} (A^T)_{nm}ATn行目のちょうど合計です。これはA\sum_{m} A_{mn}n番目の列の対応する合計と同じです。行列の乗算は重み付けされた行の合計に過ぎないので、それが表す行列の乗算は転置行列よりもうまく機能します。

同様に、\sum_{n'} A_{mn'}c_{n'}は、Am行であり、要素ごとにcで重み付けされています。

私たちは、それぞれ、cdサイズnmベクトルであると仮定することができます。 (d'は、コードには単にdと表示されます)。その場合には、操作のほとんどは、行列演算に還元することができる。

  1. \sum_{n'} A_{mn'}c_{n'}サイズmの列ベクトルが得られるだけ行列積A * c、です。
  2. \frac{d'_m}{\sum_{n'} A_{mn'}c_{n'}}は、d ./ (A * c)の要素単​​位の比率になります。また、サイズはmです。
  3. この比は、分子中のATの合計の要素をスケールするために使用され、nの行列積A.' * (d ./ (A * c))になります。
  4. \sum_{m} (A^T)_{nm}の各要素は、A.' * ones(m, 1)またはsum(A, 1).'のいずれかで表すことができるので、最終的な行列積はちょうどc .* (A.' * (d ./ (A * c)) ./ sum(A, 1).')です。

あなたが次取得するeをそれを呼び出す、sum(A, 1).'を事前に計算することができます:あなたは、各kためcの中間値を保持したい場合は、サイズn, k + 1の行列を割り当てることができ、

c = [1; 2; 3; 4]; 
d = [0.5; 0.9]; 
A = ... some 2x4 matrix; 
e = sum(A, 1).'; 
k = 50; 

for i = 1 : k 
    c = c .* (A.' * (d ./ (A * c)) ./ e); 
end 

cの新しい反復を表す各列にそれを記入してください。

c = zeros(4, 51); 
c(:, 1) = [1; 2; 3; 4]; 
for i = 1 : k 
    c(:, k + 1) = c(:, k) .* (A.' * (d ./ (A * c(:, k))) ./ e); 
end 
+0

私のコードはあなたと同じ出力を返すようです。しかし、あなたは確かにきれいで効率的です。詳しい説明もありがとう。 @ radk。 – radk

+0

あなたの実装が正しいと思われます。 –

+0

@radkこの回答が参考になった場合は、それを選択する必要があります。 –

関連する問題