创建具有概率的矩阵

时间:2010-03-23 05:53:16

标签: c++ python

我想生成一个NxN矩阵来测试我所拥有的代码,其中每行包含浮点数作为元素,并且必须加起来为1(即具有一组概率的行)。

它变得棘手的是我想确保随机的一些元素应该是0(实际上大多数元素应该是0,除了一些随机的元素是概率)。我需要概率为1 / m,其中m是单行内不为0的元素数。我试着想办法输出这个,但基本上我需要将它存储在C ++数组中。所以,即使我输出到一个文件,我仍然会遇到没有数据的问题,因为我需要它。最后,我需要该数组,因为我想生成一个Market Matrix文件。我在C ++中找到了一个实现数组并将其转换为市场矩阵文件的实现,所以这就是我的研究结果。我对其余代码的输入采用了这个市场矩阵文件,因此我需要将其作为输出的主要形式。语言没关系,我只想在最后生成文件(我在python中找到了mmwrite和mmread的方式)

请帮助,我陷入困境,并不确定如何实现这一点。

2 个答案:

答案 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