如何使用随机条目生成矩阵并对行和列进行约束?

use*_*027 2 python matlab matrix julia

如何生成一个矩阵,其条目是0到1之间的随机实数,包括附加约束:每行的总和必须小于或等于1,每列的总和必须小于或等于1.

例子:

matrix = [0.3, 0.4, 0.2;
          0.7, 0.0, 0.3; 
          0.0, 0.5, 0.1]
Run Code Online (Sandbox Code Playgroud)

Lui*_*ndo 7

如果您想要一个均匀分布并满足这些约束的矩阵,您可能需要一种拒绝方法.在Matlab中它将是:

n = 3;
done = false;
while ~done
    matrix = rand(n);
    done = all(sum(matrix,1)<=1) & all(sum(matrix,2)<=1);
end
Run Code Online (Sandbox Code Playgroud)

请注意,这对于大型来说会很慢n.


ray*_*ica 5

如果你正在寻找一种Python方式,这只是Luis Mendo的拒绝方法的转录.为简单起见,我将使用NumPy:

import numpy as np
n = 3
done = False

while not done:
    matrix = np.random.rand(n,n)
    done = np.all(np.logical_and(matrix.sum(axis=0) <= 1, matrix.sum(axis=1) <= 1))
Run Code Online (Sandbox Code Playgroud)

如果您没有NumPy,那么您可以生成2D矩阵作为列表列表:

import random 
n = 3
done = False

while not done:

    # Create matrix as a list of lists
    matrix = [[random.random() for _ in range(n)] for _ in range(n)]

    # Compute the row sums and check for each to be <= 1
    row_sums = [sum(matrix[i]) <= 1 for i in range(n)]

    # Compute the column sums and check for each to be <= 1
    col_sums = [sum([matrix[j][i] for j in range(n)]) <= 1 for i in range(n)]

    # Only quit of all row and column sums are less than 1
    done = all(row_sums) and all(col_sums)
Run Code Online (Sandbox Code Playgroud)