Asked by John
on 24 Feb 2012

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

*No products are associated with this question.*

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)

Show 4 older comments

John
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

John

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

Learn moreOpportunities for recent engineering grads.

Apply Today
## 0 Comments