我想生成一个NxN矩阵来测试我所拥有的代码,其中每行包含浮点数作为元素,并且必须加起来为1(即具有一组概率的行)。
它变得棘手的是我想确保随机的一些元素应该是0(实际上大多数元素应该是0,除了一些随机的元素是概率)。我需要概率为1 / m,其中m是单行内不为0的元素数。我试着想办法输出这个,但基本上我需要将它存储在C ++数组中。所以,即使我输出到一个文件,我仍然会遇到没有数据的问题,因为我需要它。最后,我需要该数组,因为我想生成一个Market Matrix文件。我在C ++中找到了一个实现数组并将其转换为市场矩阵文件的实现,所以这就是我的研究结果。我对其余代码的输入采用了这个市场矩阵文件,因此我需要将其作为输出的主要形式。语言没关系,我只想在最后生成文件(我在python中找到了mmwrite和mmread的方式)
请帮助,我陷入困境,并不确定如何实现这一点。
答案 0 :(得分:2)
import random
N = 10
matrix = []
for j in range(N):
t = [int(random.random()<0.6) for i in range(N)]
ones = t.count(1)
row = [float(x)/ones for x in t] if ones else t
matrix.append(row)
for r in matrix:
print r
答案 1 :(得分:0)
通过C ++数组,您的意思是C数组还是STL vector<vector< > >
?后者会更干净,但这是一个使用C数组的例子:
#include <stdlib.h>
#include <stdio.h>
float* makeProbabilityMatrix(int N, float zeroProbability)
{
float* matrix = (float*)malloc(N*N*sizeof(float));
for (int ii = 0; ii < N; ii++)
{
int m = 0;
for (int jj = 0; jj < N; jj++)
{
int val = (rand() / (RAND_MAX*1.0) < zeroProbability) ? 0 : 1;
matrix[ii*N+jj] = val;
m += val;
}
for (int jj = 0; jj < N; jj++)
{
matrix[ii*N+jj] /= m;
}
}
return matrix;
}
int main()
{
srand(234);
int N = 10;
float* matrix = makeProbabilityMatrix(N, 0.70);
for (int ii = 0; ii < N; ii++)
{
for (int jj = 0; jj < N; jj++)
{
printf("%.2f ", matrix[ii*N+jj]);
}
printf("\n");
}
free(matrix);
return 0;
};
输出:
0.00 0.20 0.20 0.00 0.00 0.00 0.00 0.20 0.20 0.20
0.25 0.00 0.00 0.00 0.00 0.25 0.00 0.25 0.25 0.00
0.00 0.33 0.33 0.33 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.50 0.00 0.00 0.50 0.00
0.25 0.25 0.00 0.00 0.00 0.00 0.25 0.00 0.25 0.00
0.00 0.25 0.00 0.00 0.00 0.25 0.25 0.00 0.25 0.00
0.00 0.00 0.33 0.00 0.33 0.00 0.00 0.00 0.33 0.00
0.00 0.20 0.20 0.20 0.20 0.00 0.00 0.20 0.00 0.00
0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.20 0.20 0.20
0.00 0.00 0.00 0.00 0.00 0.50 0.00 0.50 0.00 0.00