Как создать двоичную матрицу с rand () и определенной пропорцией единиц? - PullRequest
2 голосов
/ 23 мая 2019

Я настраиваю свою математическую модель, но сейчас я борюсь с манипулирование данными.

Я хочу создать случайную двоичную матрицу (0,1), где отношение 1 к итогу равно некоторому конкретному значению, например, 0,3. Как я могу сделать это с функцией rand()?

В Excel вы бы сделали это следующим образом, поскольку вероятность возврата 1 равна 0,2:

= IF(RAND() < 0.2, 1, 0)

1 Ответ

5 голосов
/ 23 мая 2019

Со списком понимания

Это должно сработать, здесь я предполагаю, что вам нужна матрица 3x8:

function create_random_matrix(n::Int, m::Int)
           [rand() < 0.2 for _ in 1:n, _ in 1:m]
end

mymatrix = create_random_matrix(3,8)

ifelse и троичный оператор для более сложной матрицы

Вам может понадобиться ifelse функция , если вы хотите что-то более сложное, матрицу чего-то другого, кроме двоичных файлов, например:

function create_random_matrix(n::Int, m::Int)
      [ifelse(rand() < 0.2, 10.0, -5.0+rand()) for _ in 1:n, _ in 1:m]
end

или аналогичным способом, используя троичный оператор :

function create_random_matrix(n::Int, m::Int)
      [rand() < 0.2 ? 10.0 : -5.0+rand() for _ in 1:n, _ in 1:m]
end

Массив массивов вместо 2-мерного массива

Я предположил, что вы хотите, чтобы 2-dimensional Array представлял вашу матрицу.Вместо этого может потребоваться Array of Arrays:

function create_random_matrix(n::Int, m::Int, prob::Float64)
      [[rand() < prob for _ in 1:n] for _ in 1:m]
end

Без помещения в функцию

Без помещения в функцию:

mymatrix = [[rand() < 0.3 for _ in 1:3] for _ in 1:8]

С законом распределения

Вы также можете, используя Distributions пакет , сделать следующее:

#Using Pkg; Pkg.add("Distributions") #Uncomment if you didn't already install Distributions package
using Distributions
mymatrix = rand(Bernoulli(0.3), 3, 8)

С побитовым оператором

Наконец, вы также можете использовать:

mymatrix = rand(3, 8) .< 0.3

Это простое решение в обозначенном виде, которое возвращает BitArray, которое может или не может быть тем, что вам нужно.Это также неудобно для создания ненужного массива.

Улучшено благодаря

Этот ответ был улучшен благодаря комментариям @ Bogumił Kamiński и @ DNF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...