Hi, I have a matrix
B =
0 9 7 0 0
0 9 7 6 0
0 2 7 6 0
8 0 4 2 0
rows represent time series and columns represent assets. In each row ( time) I need to get a strategy which allocates 1 equally to assets that do not equal zero. The results for the strategy s should =[0 1/2 1/2 0 0; 0 1/3 1/3 1/3 0;0 1/3 1/3 1/3 0;1/3 0 1/3 1/3 0]. My code is as follows but I am looking for a more efficient solution. Thank you.
weight=zeros(4,5);
for r=1:4
countzero=0;
index=[];
for c=1:5
if B(r,c)==0
weight(r,c)=0;
else countzero=countzero+1;
index=[index,c];
end
end
weight(r,index)=1/countzero;
end

 Réponse acceptée

John D'Errico
John D'Errico le 1 Nov 2015
Modifié(e) : dpb le 1 Nov 2015

0 votes

Learn to think in terms of matrices, and operations on them. Finally, learn to use tools like bsxfun, which helps greatly on these problems.
You want to create a new matrix, with zero where you have zeros, and 1 over the number of non-zeros in that row of your array.
W = (B ~= 0);
W = bsxfun(@rdivide,W,sum(W,2));
W =
0 0.5 0.5 0 0
0 0.33333 0.33333 0.33333 0
0 0.33333 0.33333 0.33333 0
0.33333 0 0.33333 0.33333 0

Plus de réponses (1)

dpb
dpb le 1 Nov 2015

0 votes

wt=bsxfun(@rdivide,B>0,sum(B>0,2));

Catégories

En savoir plus sur Language Fundamentals dans Centre d'aide et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by