MATLAB Answers


Calculating a weighted average of multiple matrices

Asked by John
on 24 Feb 2012
Latest activity Edited by Mona M Kanafi on 24 Oct 2013


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']) ; 

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)]


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




No products are associated with this question.

1 Answer

Answer by Andrei Bobrov
on 24 Feb 2012
 Accepted answer

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)


on 28 Feb 2012

Hello Andrei,

Thank you for your help with my weighted average problem.

I'm just wondering if the code for pl and C needs to be changed if I change the size of the matrices say from 3x3 to 9x9?

It seems to be working fine, but I thought I should double check with you.

Many thanks


No, do not change

on 28 Feb 2012


Join the 15-year community celebration.

Play games and win prizes!

Learn more
Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!