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)
如果您想要一个均匀分布并满足这些约束的矩阵,您可能需要一种拒绝方法.在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.
如果你正在寻找一种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)
| 归档时间: |
|
| 查看次数: |
1168 次 |
| 最近记录: |