0
a = [0.04 0.07 0.09 0.13 0.14 0.17 0.21 0.24
0.14 0.06 0.08 0.15 0.11 0.13 0.10 0.11
0.13 0.13 0.11 0.15 0.10 0.07 0.14 0.11
0.12 0.04 0.18 0.13 0.19 0.16 0.14 0.11
0.18 0.06 0.22 0.15 0.14 0.06 0.08 0.09
0.15 0.04 0.08 0.06 0.13 0.05 0.10 0.09]

C = cov(a)
alpha = 0.12
beta = (.20-.12)

for i = 1 : 6
    for j = 1 : 8
        f(i,j) = alpha + beta*rand(1)
    end     
    % f(i,1)=f(i,1)/sum;f(i,2)=f(i,2)/sum;f(i,3)=f(i,3)/sum;
end
total = sum(f,2)
while total(i,1) > .999 & total (i,1) <.977
    for i = 1:6
        for i = 1:8
            f(i,j) = f(i,j) - .0001
        end
    end
end

配列要素のすべての要素の値が0.12から0.20の間で、行方向の配列の合計(コード内のf変数)が 1にほぼ等しくなるように、配列のすべての要素から.0001を減算しようとしています。 。ほぼ私は、合計の値(コード内の変数)が()0.999より小さく、().977より大きくなければならないことを意味しますtotalftotal<>

4

1 に答える 1

1
lb = 0.12; 
ub = 0.20;
sensitivity = 0.02;
inc = 0.001;


f = lb + (ub-lb).*rand([6,8]); % See Note Below
total = sum(f,2);
f = f./repmat(total + sensitivity,[1,8]);

while(any(any(g<lb)) || any(any(g>ub)) || any(total>0.99) || any(total<0.97))

    f(f<lb) = lb + inc;
    f(f>ub) = ub - inc;

    total = sum(g,2);
    f = f./repmat(total + sensitivity,[1,8]);
    inc = inc + 0.001;
end

注:一般に、行列操作を実行できる場合、matlabでネストされたforループを実行することはできません。したがって、この1行は、fを作成するか、そこからデクリメントする必要があるネストされたforループを置き換えます。

このコードは、(1)が0.12(lb)から0.20(ub)の間の値を持ち、行の合計が約0.98である行列fを与えるはずです。

于 2012-05-06T23:44:54.850 に答える