2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 02:37 


07/01/12
69
GAA в сообщении #1511927 писал(а):
В начальном сообщении было написано, что фиксируются не строки/столбцы, а отдельные элементы
Потом разговор зашёл о строках
А теперь вообще об одномерном массиве.

Строки – частный случай понятия "отдельные элементы". Уточнил, т.к. Вы просили уточнений.
Одномерный массив привел, т.к. бóльших размерностей Вы боитесь. Если предложите что-то дельное для одномерного, я при необходимости применю это и к 10-мерному.
Не надо к словам цепляться.

GAA в сообщении #1511927 писал(а):
Ничто не мешает руки заменить программной реализацией. Специально постарался повторить действия рук.

Взгляните на мою функцию, которую я привел по Вашей просьбе.
Я, конечно, не сомневаюсь, что вы сможете повторить действия рук и для такой, но очевидно, что это далеко не самый рациональный путь.
Спасибо, конечно, за попытки.

Вообще, вопрос касался fminsearch, а не моей функции. А именно, есть ли для fminsearch способ зафиксировать отдельные элементы.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 07:14 
Заслуженный участник


12/07/07
4522
Нет такого способа. (Кроме как переписать.)

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 13:17 


07/01/12
69
GAA в сообщении #1511972 писал(а):
Нет такого способа. (Кроме как переписать.)

Есть такой способ. Я уже сделал. Правда, не в полной общности. Скорее всего обойдусь тем, что получилось.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 13:57 
Заслуженный участник


12/07/07
4522
Если скорость выполнения не имеет значения, то способов можно предложить несколько.
Например, можно целевую функцию оформить в виде m-функции, и в этой функции объявить глобальные переменные: I через которую будет функции передаваться информация о том, какие переменные не изменяются, и X — c фиксированными значениями.
В начале целевой функции, используя указанную матрицу I, создаётся матрица, с элементами равными для изменяемых переменных значениям, переданным при вызове, а для неизменяемых --- значениям из X.
Минусы: скорость (при каждом вызове получение матрицы в начале целевой функции) и глобальные переменные.

Разумных альтернатив переписыванию целевой функции в старых версиях я не знаю. Интересно бы было увидеть такие.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 17:15 


07/01/12
69
Ну да, суть такая, только я передаю не через глобальные, а через агрументы.
Используется синтаксис Matlab M
function f=f(xy,d,xy_var,vn)

% vn~=0 - № элемента, координаты которого подстраиваем;
% vn==0 - подстраиваем координаты всех элементов.

% xy_var - значения (x y) координат элемента № vn

if vn
  xy(vn,:)=xy_var;
end
.........
.........
 


Для минимизации по одной паре переменных:
Используется синтаксис Matlab M
xy_new=fminsearch (@(v) f([x' y'],d,v,k),[x(k) y(k)]);
x(k)=xy_new(1);
y(k)=xy_new(2);
 


Для минимизации по всем:
Используется синтаксис Matlab M
xy_new=fminsearch (@(xy) f(xy,d,0,0),[x' y']);
x=xy_new(:,1)';  
y=xy_new(:,2)';
 


Возможно, этого и хватит. При необходимости можно и для любых комбинаций доделать.

Еще раз напоминаю, что вопрос был о наличии штатных средств в Matlab.
Судя по отсутствию ответа, штатных нет.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 17:34 
Заслуженный участник


12/07/07
4522
Указанный вами подход: вложить функцию с больше чем одним входным аргументом (основную) в анонимную с одним аргументом (обёртку), как раз в справке пакета и предлагается: https://www.mathworks.com/help/matlab/m ... tions.html
Цитата:
You also can use anonymous functions to call more complicated objective functions that you define in a function file. For example, suppose you have a file named cubicpoly.m with this function definition:

function y = cubicpoly(x,b,c)
y = x^3 + b*x + c;
end
At the command line, define b and c, and then call fzero with an anonymous function that invokes cubicpoly:

b = 2;
c = 3.5;
x = fzero(@(x) cubicpoly(x,b,c),0)
Более штатного трудно и придумать. :)

В функции с большим числом аргументов (основной) как писал выше ozheredov часть матрицы переданной из fminsearch можно заменить на значения, которые хотим фиксировать.

Плюс: нет глобальных переменных. Минус: увеличение числа вызовов и передаваемых входных аргументов.
Общности подхода вполне достаточно для самых разнообразных случаев.

-- Пн 29.03.2021 16:38:41 --

С "вложением" функций или глобальными переменными (или глобальными и статическими), очевидно как написать.
Если время вычислений целевой функции велико, а число переменных относительно мало, то затраты на переприсвоение массивов не скажутся значительно.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение02.04.2021, 07:15 


07/01/12
69
GAA в сообщении #1512063 писал(а):
вложить функцию с больше чем одним входным аргументом (основную) в анонимную с одним аргументом (обёртку)

Спасибо. Возможно, так получилось бы красивее, чем я сделал. Но сейчас уже сделал как сделал.
На будущее буду держать на заметке.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group