Одним из решений является создание вашей матрицы изначально как cell array, содержащей как числовые значения, так и function handles, для функций, предназначенных для генерации значения для этой записи. Для примера, вы можете сделать следующее:
generatorMatrix = {1 -1; 2 @randn};
Тогда вы могли бы создать функцию, которая принимает матрицу выше формы, evaluates the cells containing function handles, затем объединяют результаты с помощью цифровых входов клеток в create a numeric matrix использовать для дальнейших расчетов :
function numMatrix = create_matrix(generatorMatrix)
index = cellfun(@(c) isa(c,'function_handle'),... %# Find function handles
generatorMatrix);
generatorMatrix(index) = cellfun(@feval,... %# Evaluate functions
generatorMatrix(index),...
'UniformOutput',false);
numMatrix = cell2mat(generatorMatrix); %# Change from cell to numeric matrix
end
Некоторые дополнительные вещи, которые вы можете сделать, будет использовать anonymous functions делать более сложные вещи с встроенными функциями или создавать записи ячеек разного размера.Это иллюстрируется следующей матрицей образцов, которая может быть использована для создания матрицы с первой строкой, содержащей 5, а затем 9, а остальные 9 строк содержат 1, а затем 9 чисел, полученных из равномерного распределения между 5 и 10:
generatorMatrix = {5 ones(1,9); ones(9,1) @() 5*rand(9)+5};
И каждый раз, когда эта матрица передается create_matrix
она будет создавать новую матрицу 10 на 10, где подматрица 9-по-9 будет содержать различный набор случайных значений.
Альтернативное решение ...
Если матрица может быть легко разбить на блоки подматриц (как и во втором примере, приведенном выше), а затем, используя массив ячеек для хранения числовых значений и функциональные ручки может быть вашим лучшим вариантом.
Однако, если случайные значения являются единичными элементами, рассеянно рассеянными по всей матрице, то вариация, аналогичная той, что user57368 suggested может работать лучше. Вы можете хранить ваши матричные данные в трех частях: цифровая матрица с заполнителями (например, NaN), где будут отображаться произвольно генерируемые значения, индексный вектор, содержащий linear indices позиций произвольно сгенерированных значений, и массив ячеек такой же длины, как индексный вектор, содержащий function handles для функций, которые будут использоваться для генерации случайных значений. Чтобы упростить задачу, вы можете хранить эти три части данных в structure.
В качестве примера, следующее определяет матрицу 3 на 3 с 3 случайными значениями, хранящуюся в индексах 2, 4, и 9 и составленное соответственно от normal distribution, а uniform distribution от 5 до 10, и exponential distribution:
matData = struct('numMatrix',[1 nan 3; nan 2 4; 0 5 nan],...
'randIndex',[2 4 9],...
'randFcns',{{@randn , @() 5*rand+5 , @() -log(rand)/2}});
и вы можете определить новую функцию create_matrix
легко создать матрицу из этих данных:
function numMatrix = create_matrix(matData)
numMatrix = matData.numMatrix;
numMatrix(matData.randIndex) = cellfun(@feval,matData.randFcns);
end
ли все случайные элементы, поддерживаемые всегда нормально распределены и независимы? Или вам нужно поддерживать другие дистрибутивы и/или ковариацию? – aschepler
Более подробная информация о том, как будут выглядеть эти большие матрицы, поможет нам дать вам более конкретные решения. В частности, будут ли случайные значения сгруппированы в подматрицы в большей матрице или они будут разбросаны по всей большей матрице? – gnovice
@aschepler: Мне нужно, чтобы он поддерживал пользовательские случайные переменные, а также другие общие типы случайных величин (например, нормальный, бета, единообразный и т. Д.) –