Calculating a weighted average of multiple matrices
    4 views (last 30 days)
  
       Show older comments
    
Hello,
I was hoping that perhaps somebody could help me out with a problem that I have. It is a relatively simple operation (a weight average), just difficult to code.
Say I import 2 3x3 matrices into a cell array using the code below.
C = cell(2,1); 
for ii = 1:2
C{ii} = importdata(['matrix' num2str(ii) '.txt']) ; 
end
These matrices are transitional probability matrices.
I would like to calculate a weighted 'average' matrix of these 2 matrices. Unfortunately I cannot simply just calculate the average, its needs to be a weighted average.
Say for example the 2 matrices are:
  0.0  0.5  0.5  2
A =   0  0  1  4
  0  0.6  0.4  7
  0.2  0.0  0.8  5
B =   0  0  0  0
  0.3  0.0  0.7  3
The 4th column contains the number of counts for that particular row.
The weighted average formula would be
P(x) = P_A(x) x [1-B_N/(A_N+B_N)]  + P_B(x) x [1-A_N/(A_N+B_N)]
Where,
P_A(x) represents the probability value in the same row at cell x for matrix A.
P_B(x) is the same thing for matrix B.
A_N is the total number of counts for the same row we are dealing with in matrix A
B_N is the total number of counts for the same row we are dealing with in matrix B
Using the numbers, the first cell would be:
 = 0 x [1-5/(2+5)] + 0.2 x [1-2/(2+5)] = 0.14
So the full weighted average matrix would be
  0.14  0.14  0.71
C=  0  0  1
  0.1  0.4  0.5
I would really appreciate any help to code this as I'm fairly inexperienced with matlab. In practice I have about 100 matrices but I just presented 2 as an example.
Sincere Thanks
John
0 Comments
Accepted Answer
  Andrei Bobrov
      
      
 on 24 Feb 2012
        A =[        0          0.5          0.5            2
            0            0            1            4
            0          0.6          0.4            7];
B =[      0.2            0          0.8            5
            0            0            0            0
          0.3            0          0.7            3];
C1 = cat(3,A,B);
p1 =  bsxfun(@rdivide,C1(:,end,:),sum(C1(:,end,:),3));
C = sum(bsxfun(@times,C1(:,1:end-1,:),p1),3)
7 Comments
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
