Замените переменные случайными числами

В результате вычислений в Mathematica я получил огромную матрицу с пронумерованными переменными вида a[1],...,a[100] в некоторых элементах. Я хотел бы импортировать эту матрицу как шаблон в Matlab, а затем заменить переменные случайными числами (нормально распределенными). Я совершенно не знаком с поддержкой символических переменных в Matlab и не уверен, поддерживает ли он индексированные символьные переменные. Мне нужна функция, которая ищет a[k] и заменяет их случайным числом.

В Mathematica у меня есть квадратные матрицы матриц длины 2 ^ n, которые становятся все более и более разреженными по мере роста n и зависят от 5 * n (пока символических) переменных a [k]. Для n=2 матрица еще совсем не разреженная и выглядит так (в Mathematica-Code):

{{a[3] + a[3], a[7] - I a[8], a[10], I a[8]},

{I a[8], +a[6], I a[5], -I a[9] - a[8]},

{a[7] + I a[8], +a[2], I a[5], -a[7]},

{I a[8], a[2], a[2] + I a[15], -a[8]}}

Существует скрипт ToMatlab, который преобразует нотацию Mathematica для матриц в нотацию Matlab. У меня практически полная свобода переименования переменных, так как это наиболее подходит для использования в Matlab. Теперь я хотел бы создать функцию в Matlab, которая возвращает эту точную матрицу (для фиксированного n сейчас будет достаточно, поэтому матрица действительно фиксирована) и заменяет a[k] нормально распределенным случайным числом.


person Dominik    schedule 01.05.2014    source источник
comment
Не могли бы вы дать немного больше информации - сделать игрушечный пример из тех данных, которые у вас есть? Похоже, у вас очень большая (N››100) матрица, содержащая всего 100 различных символов. Возможно, вы сохранили его как массив ячеек строк?   -  person Floris    schedule 02.05.2014
comment
Просто чтобы уточнить - я думаю, у вас есть несколько шагов. 1) Mathematica генерирует огромную матрицу. 2) импортируешь эту матрицу в Matlab (как?) 3) заменяешь символы значениями. Вы явно знаете, как это сделать (1). У вас проблемы и с (2), и с (3)?   -  person Floris    schedule 02.05.2014
comment
Спасибо за ваш комментарий. Я прекрасно знаю, как импортировать в Matlab матрицы с числами, но не знаю, что делать с символьными матрицами. Однако импорт не является моей главной заботой, так как я найду способ автоматизировать его, если необходимо, с помощью какого-нибудь внешнего скрипта. Я понятия не имею, как сделать (3) в Matlab, насколько я знаю, я знаю только, как генерировать векторы случайных чисел, но я не вижу, как заменить такой вектор в мои символические переменные.   -  person Dominik    schedule 02.05.2014
comment
Вам нужно уточнить, как вы храните символические переменные. Являются ли они массивом ячеек строк?   -  person Floris    schedule 02.05.2014
comment
Технически они a[k] — это (пока) неопределенная функция a, вычисляемая в k. Но их можно просто использовать как индексированные переменные.   -  person Dominik    schedule 02.05.2014


Ответы (1)


Предполагая, что у вас есть массив ячеек строк (намного больше, чем этот простой пример):

import = {'a1','a2';'a2','a4'};

Затем вы можете заменить 100 значений нормально распределенными случайными числами следующим образом (очевидно, вы захотите заменить константы и т. д. нужными вам значениями):

newMatrix = zeros(size(import));

% generate 100 random numbers:
mean = 123.45;
stdDev = 21.0;
N = 100;
randVals = randn(1,N) * stdDev + mean;

for ii=1:N
  indx = find(ismember(import, sprintf('a%d',ii)));
  newMatrix(indx) = randVals(ii);
end

Новые значения будут в матрице newMatrix

Это не очень эффективно; но это может быть началом, и могут появиться другие ответы (если вы можете подтвердить, что это действительно делает то, что вы намереваетесь - все еще не на 100% уверен, что понимаю ваш вопрос).

person Floris    schedule 01.05.2014
comment
Это не нужно делать часто, поэтому я думаю, что этого достаточно. Благодарю вас! - person Dominik; 02.05.2014