Как я могу запускать функции Matlab для нескольких парных входов и выводить матрицу?

Я новичок в Matlab, и до сих пор я научился оценивать функции нескольких переменных по одному вектору данных, как в следующем примере:

>>data = [1,2,3,4,2,2.5,2.9,1.8,-1,1.8]
>>fun=@(x) (1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2)) %A Normal distribution
>>fun([1,2])

Columns 1 through 9

    0.1995    0.1760    0.1210    0.0648    0.1760    0.1506    0.1270    0.1841    0.1210

  Column 10

    0.1841

Это работает, как и ожидалось, но как насчет следующей функции, с несколькими источниками данных?

>>data1 = [1,2,3,4,2,2.5,2.9,1.8,-1,1.8]
>>data2 = [1,2,3.1,4.1,2.1,2.51,3.1,-1,1.9,2] 
>>p = .5092
>>fun = @(x) (1/(2*pi*x(2)*x(4)*sqrt(1-p^2))) * exp( (-1/(2-2*p^2)) * ( (data1-x(1)).^2/(x(3)^2) + (data2-x(2)).^2/(x(4)^2) - (2*p(data1-x(1))*(data2-x(2)))/(x(3)*x(4)) ) ) % A joint-probability distribution
>>fun([1,2,3,4])

Subscript indices must either be real positive integers or logicals.

Error in
@(x)(1/(2*pi*x(2) . . .

Это последнее уравнение представляет собой просто совместное распределение вероятностей, и каждое наблюдение состоит из парных значений x и y. Как бы я запускал эту и подобные функции одновременно для данных1 и данных2, выполняя итерацию по одному и тому же индексу для них обоих, по одному числу за раз, создавая матрицу выходов?

Причина, по которой я не могу просто запустить цикл, заключается в том, что мне нужно ввести эту функцию в процесс оптимизации функции fminunc(), чтобы она могла оценить F. для каждой пары значений.


person Coolio2654    schedule 27.01.2018    source источник


Ответы (1)


Вы написали 2*p(data1-x(1)), тогда p рассматривается как вектор, измените это на 2*p.*(data1-x(1)). Вторая ошибка (data1-x(1))*(data2-x(2)). Это матричное умножение, и поскольку размеры не совпадают, это даст ошибку. Я предполагаю, что вам нужно скалярное умножение, затем снова добавьте ., чтобы оно стало (data1-x(1)).*(data2-x(2))

person ViG    schedule 27.01.2018
comment
Когда именно должен быть . разместить для поэлементных операций? Это везде вокруг любого вектора, даже для сложения/вычитания, или есть еще правила, о которых я должен знать? - person Coolio2654; 27.01.2018
comment
@ Coolio2654 Точка предназначена только для скалярного умножения или деления, когда задействованы векторы / матрицы. - person ViG; 28.01.2018
comment
Хорошо, теперь мой код запускается, если я определяю две data() в своей анонимной функции так, как вы предложили. У меня есть еще один вопрос, надеюсь, вы сможете ответить. Функция, которую я создаю для запуска всего этого процесса, принимает data в качестве входных данных, но если имеется более одного источника данных наблюдений (как в этой ситуации), я не знаю, как разрешить функции принимать случайные количества data. Итак, есть ли способ заархивировать/объединить любые два источника наблюдений в один файл с двумя измерениями и запустить функцию над этим? - person Coolio2654; 28.01.2018
comment
@ Coolio2654 Вы имеете в виду объединение data1 и data2 в 1 переменной данных? Это, безусловно, возможно. Если у вас есть 2 вектора-строки одинаковой длины (скажем, 1xn), то data = [data1;data2] представляет собой матрицу 2xn с 1-й строкойdata1 и 2-й строкойdata2. В случае двух векторов-столбцов это data = [data1 data2]. Это то, что вы имели ввиду? - person ViG; 28.01.2018
comment
Да, и запустить какую-нибудь функцию fun() для обоих столбцов, рассматривая их как отдельный источник данных, соответствующий data1, data2,... . Я объединил их оба в один файл, как вы сказали, но это не работает, так как функция не распознает информацию. Есть ли способ заставить функцию просматривать определенные размеры матрицы для всех ее наборов наблюдений? - person Coolio2654; 28.01.2018
comment
@ Coolio2654 вы имеете в виду обращение к data1 и data2? Точно так же, как если бы вы обращались к строкам матрицы. Итак, для data матрица 2xn с 1-й строкой data1, 2-й data2: data1==data(1,:) и data2==data(1,:). - person ViG; 29.01.2018