【问题标题】:Add programmatically random values to a matrix using matlab使用 matlab 以编程方式将随机值添加到矩阵
【发布时间】:2017-12-15 20:08:49
【问题描述】:

我是 Matlab 的新手,我正在尝试以编程方式创建一个方阵,它可能有一些随机的随机列,但我想不出一个可行的解决方案。通过随机列,我的意思是为正的列元素的总和应该等于 1(列非零元素应该相同并且它们的总和等于 1)。非零元素的位置在矩阵中并不重要。 PS:有些列可能是全零元素,有些可能只有一个非零元素,在本例中为 1。

我需要您的指导或这些家伙的工作代码示例。提前致谢。

这是一个例子:

A=
0.2500    0.5000         0         0         0         0         0
0.2500    0.5000    0.3333         0         0         0         0
     0         0    0.3333    0.2500         0         0    0.3333
0.2500         0         0    0.2500         0    0.5000         0
0.2500         0         0    0.2500         0         0         0
     0         0         0    0.2500         0    0.5000    0.3333
     0         0    0.3333         0         0         0    0.3333

% here is my code but it's not doing the work yet
n = 5;
A = zeros(n, 5); 
i = 0;
for i = 1:n
  if rand < 0.5
    i = i + 1;
    A(i, :) = rand(1, 5);
  end
end
A = A(1:i, :)

【问题讨论】:

    标签: matlab matrix sparse-matrix programmatically-created stochastic


    【解决方案1】:

    首先像你做的那样生成一个随机浮点矩阵和阈值。设置阈值后,只需沿每列求和,然后将每列除以总和。广播在这里很有用,这样您就不必在所有行上循环或复制每列的总和值。

    这样的事情应该可以工作:

    n = 7;
    A = rand(n, n) >= 0.5;
    sumA = sum(A, 1);
    A = bsxfun(@rdivide, A, sumA);
    
    % Or in MATLAB R2016b and up:
    % A = A ./ sumA;
    
    A(isnan(A)) = 0;
    

    前两行是不言自明的。选择n,然后创建一个随机0和1的n x n方阵。第三行找到每列的总和,第四行是 pièce de resistance 正在获取每列的总和并进行内部复制,以便您创建一个相同的临时矩阵大小作为随机矩阵,但每个列包含该列的总和。然后,您明智地划分元素,这会产生您的结果。这是通过bsxfun 函数实现的。最后一行代码非常重要。假设您有一列没有 1。这意味着当需要进行规范化时,我们将遇到一个 0 / 0 错误,它转换为NaN。最后一行代码查找任何为 NaN 的值并将它们设置为 0。

    或者,在 MATLAB R2016b 及更高版本中,您可以简单地执行元素除法运算符 ./,它已经完成了广播。

    示例运行

    运行上述代码后,这是一个潜在的结果:

    >> A
    
    A =
    
        0.2500    0.5000         0    0.2500         0         0         0
             0         0    0.2500    0.2500    1.0000         0         0
             0         0         0    0.2500         0    0.2500    0.3333
        0.2500         0         0    0.2500         0    0.2500         0
        0.2500    0.5000    0.2500         0         0    0.2500         0
             0         0    0.2500         0         0    0.2500    0.3333
        0.2500         0    0.2500         0         0         0    0.3333
    

    所有零列呢?

    为确保代码适用于所有零列,只需在创建随机矩阵时使阈值更具侵略性。让它更高,比如 0.8 左右。这意味着你得到 0 的机会比 1 更高。

    因此,我将第二行代码改为:

     A = rand(n, n) >= 0.8;
    

    当我这样做并再次运行代码时,这就是我一次运行得到的结果:

    >> A
    A =
    
             0         0         0    0.2500         0    0.5000         0
             0    0.5000    1.0000    0.2500         0    0.5000         0
             0         0         0         0    1.0000         0    1.0000
             0    0.5000         0         0         0         0         0
             0         0         0         0         0         0         0
             0         0         0    0.2500         0         0         0
             0         0         0    0.2500         0         0         0
    

    【讨论】:

    • 感谢@rayryeng 的回答和解释,非常清楚。我试过了,效果很好。我进行了许多运行测试,如果创建的某些列可能具有全零元素,那就太好了。你认为上面的代码你帮助我回应了吗?
    • @Stackgeek 是的,代码应该适用于所有零列。我能做的是使阈值更具侵略性,以便您可以看到它适用于所有零列。我会修改我的答案。
    • 好的,我明白了,这对我来说更清楚了。再次感谢@rayryeng,你太棒了。
    • @Stackgeek Pas de problème :)
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多