2017-10-19 111 views
0

我有一个方程式,我试图在Matlab中编写代码,但我不确定代码是否正确。该方程如下:以下等式的Matlab等效代码

Equation

当我认为迭代是在上标,即K,K + 1等,并尺寸由标m标记,N,N”。这些符号在文献中没有很好的定义,所以我认为这是应该的。

这个公式我的代码段如下:

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

我们需要更多洞察力,您在此处列出的变量的永久性。 'c'和'd'向量? A是矩阵吗? – rayryeng

+0

是'c'和'd'是向量,'A'是一个矩阵(mxn)。 'A^T'只是'A'的转置。 – radk

+0

这些都是基本的矩阵运算,不需要求和。这就是为什么他们有一个总和超过'A^T'而不是相同的总和而不是'A'的索引转置。 –

回答

1

如果Am行和列n,矩阵然后总和\sum_{m} (A^T)_{nm}只是在ATn第i行的总和。这与A中的n th列的相应总和相同:\sum_{m} A_{mn}。它表示的矩阵乘法对于转置更好,因为矩阵乘法只是加权行的总和。

类似地,\sum_{n'} A_{mn'}c_{n'}m第012行的A,由c加权元素方式。

我们可以假设,cd分别为大小nm的载体。 (d'将在代码中以简单的d表示)。在这种情况下,大部分的操作可以减少到矩阵运算:

  1. \sum_{n'} A_{mn'}c_{n'}仅仅是矩阵乘积A * c,其产生大小m的一个列向量。
  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).')

您可以预先计算sum(A, 1).',叫它e得到如下:

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中间值为每个k,您可以分配大小n, k + 1的矩阵并填写代表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

+0

@radk。我怀疑你的实现也是正确的。 –

+0

@radk,如果这个答案有帮助,你应该选择它。 –