создание матрицы с вероятностями - PullRequest
1 голос
/ 23 марта 2010

Я хочу сгенерировать матрицу NxN, чтобы протестировать некоторый код, который у меня есть, где каждая строка содержит плавающие элементы и должна добавить до 1 (то есть строку с набором вероятностей).

Сложность заключается в том, что я хочу убедиться, что некоторые элементы случайным образом должны быть равны 0 (на самом деле большинство элементов должно быть равно 0, за исключением некоторых случайных элементов, которые являются вероятностями). Мне нужно, чтобы вероятности были 1 / m, где m - это количество элементов, которые не равны 0 в одной строке. Я пытался придумать способы вывода этого, но по сути мне нужно, чтобы это хранилось в массиве C ++. Таким образом, даже если я выведу файл, у меня все равно будет проблема отсутствия его в массиве, как мне это нужно. В конце всего этого мне нужен этот массив, потому что я хочу создать файл Market Matrix. Я нашел реализацию в C ++, чтобы взять массив и преобразовать его в файл рыночной матрицы, поэтому на этом я основываю свои выводы. Мои входные данные для остальной части кода заносятся в этот файл рыночной матрицы, поэтому мне нужно, чтобы это была основная форма вывода. Язык не имеет значения, я просто хочу сгенерировать файл в конце (я также нашел способ mmwrite и mmread в python)

Пожалуйста, помогите, я застрял и не совсем уверен, как это реализовать.

Ответы [ 2 ]

2 голосов
/ 23 марта 2010
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
0 голосов
/ 23 марта 2010

Под массивом 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...