2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 02:37 
GAA в сообщении #1511927 писал(а):
В начальном сообщении было написано, что фиксируются не строки/столбцы, а отдельные элементы
Потом разговор зашёл о строках
А теперь вообще об одномерном массиве.

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

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

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

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

 
 
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 07:14 
Нет такого способа. (Кроме как переписать.)

 
 
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 13:17 
GAA в сообщении #1511972 писал(а):
Нет такого способа. (Кроме как переписать.)

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

 
 
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 13:57 
Если скорость выполнения не имеет значения, то способов можно предложить несколько.
Например, можно целевую функцию оформить в виде m-функции, и в этой функции объявить глобальные переменные: I через которую будет функции передаваться информация о том, какие переменные не изменяются, и X — c фиксированными значениями.
В начале целевой функции, используя указанную матрицу I, создаётся матрица, с элементами равными для изменяемых переменных значениям, переданным при вызове, а для неизменяемых --- значениям из X.
Минусы: скорость (при каждом вызове получение матрицы в начале целевой функции) и глобальные переменные.

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

 
 
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение29.03.2021, 17:15 
Ну да, суть такая, только я передаю не через глобальные, а через агрументы.
Используется синтаксис 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 
Указанный вами подход: вложить функцию с больше чем одним входным аргументом (основную) в анонимную с одним аргументом (обёртку), как раз в справке пакета и предлагается: 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 
GAA в сообщении #1512063 писал(а):
вложить функцию с больше чем одним входным аргументом (основную) в анонимную с одним аргументом (обёртку)

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

 
 
 [ Сообщений: 22 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group