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

我一直在尝试从数组的每个元素中减去 .0001,f这样数组元素的每个结果元素的值应该在 0.12 和 0.20 之间,并且按行排列,数组的总和(total代码中的变量)f 应该几乎等于 1 . 几乎我的意思是总和的值(total代码中的变量)应该小于 ( <) 0.999 并且大于 ( >) .977

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 循环是不好的。因此,这一行替换了您必须创建 f 或从中递减的嵌套 for 循环。

此代码应为您提供一个矩阵 f,其中 (1) 的值介于 0.12 (lb) 和 0.20 (ub) 之间,并且行总和约为 0.98。

于 2012-05-06T23:44:54.850 回答