2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:00 


26/09/17
333
Пусть длина вектора A из натуральных чисел определяет число вложенных циклов, а каждая его компонента - число итераций в соответствующем цикле. Как создать скрипт или функцию в зависимости от произвольного A?

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:52 
Заслуженный участник
Аватара пользователя


01/09/13
4644
Код:
while any(A)....

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:55 


10/03/16
4444
Aeroport
Инициируем вектор итераций единицами и далее инкрементируем на 1 его максимальную по номеру $i$ компоненту, которая меньше $A_i$

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 12:28 


26/09/17
333
Ух ты! Никогда так не делал, спасибо огромное! Будем посмотреть!)

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 17:30 


26/09/17
333
Geen в сообщении #1613375 писал(а):
Код:
while any(A)....
Склоняюсь к тому, чтобы запускать решатель solve в цикле while, добавляя каждое новое полученное решение в качестве дополнительного ограничения при выполнении очередной итерации (остановка - получение пустого решения).
Но тут сразу всплыла проблема - как наложить условие 'integer' и неотрицательности, если все переменные генерируются внутри вектора? Соответствующую строку в коде выделил знаками вопроса:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
% === Герерируем множество всех наборов   ===

% === Input Data ==========
n=30;
k=[4 5 5 6];

% ==== Algorithm =====
k=sort(k);
if max(k)>n
    disp 'k должно быть меньше n'
    return
end
% == составляем уравнение ===
X=sym('x',[1 length(k)]);
% надо наложить условие на переменные в X: каждая целая, причем неотрицательная
% ??????????????????????
sym s;
s=k(1)*X(1);
for i=2:length(L)
    s=s+k(i)*X(i);
end
s
 
Подскажите?

-- 13.10.2023, 19:15 --

С этой проблемой разобрался:
Используется синтаксис Matlab M
X=sym('x',[1 length(k)] 'integer');

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 21:27 


26/09/17
333
Geen в сообщении #1613375 писал(а):
Код:
while any(A)....
Запустил while c решателем solve (до получения пустой структуры). После нахождения второго решения Матлаб начинает ругаться:
Warning: Solutions are parameterized by the symbols: k, l, m. To include parameters and conditions
in the solution, specify the 'ReturnConditions' value as 'true'.

Пробую вставить - все ломается(( Помогите, плиз:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
% === Input Data ==========
n=30;
k=[4 5 5 6];

% ==== Algorithm =====
if max(k)>n
    disp 'k не может быть больше n'
    return
end
% == создаем переменные и налагаем на каждую общие условия
X=sym('x',[1 length(k)], 'integer');
for i=1:length(X)
    assumeAlso(X(i)>-1)
end
% == составляем уравнение ===
sym eq
eq=k(1)*X(1);
for i=2:length(X)
    eq=eq+k(i)*X(i);
end
eq

% ===== дальше организуем цикл  solve для решателя до получения пустой структуры
RES=[];
t=0;
while t==0
% === решаем ===============    
S=solve(eq==n,X);
%[S, X, k, l, m, conds] = solve(eq==n, X, 'ReturnConditions', true);
if isempty(S)==1
    t=1;
else
    % === Извлекаем набор переменных из структуры
    a=struct2cell(S);
    for i=1:length(X)
        a{i,1}=double(a{i,1});
    end
    a=a';
    temp=zeros(1,length(X));
    for i=1:length(X)
        temp(i)=a{1,i};
    end
    % === Добавляем в матрицу результатов
    RES=[RES;temp]
    % === Добавляем к условиям на переменную
    assumeAlso(X~=temp)
end
end

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 21:51 
Заслуженный участник
Аватара пользователя


01/09/13
4644
maximkarimov в сообщении #1613424 писал(а):
Подскажите, плиз, как найти место где нужно указать 'true'?

Понятия не имею. То что я написал, был не код, а идея. Та же самая, которую чуть подробнее написали следующим постом.
Что Вы делаете, и зачем Вам это нужно - боюсь, кроме Вас пока никто не знает.

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 21:53 


10/03/16
4444
Aeroport
maximkarimov в сообщении #1613424 писал(а):
specify the 'ReturnConditions' value as 'true'


По-видимому солвер принимает пары значений "name, value". Напишите после УЖЕ скармливаемых ему переменных:

(...., 'ReturnConditions', 'true')

-- 13.10.2023, 21:58 --

И хэлпы почитайте )

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 22:16 
Заслуженный участник


23/05/19
1147
maximkarimov
Посмотрите вот тут
https://www.mathworks.com/matlabcentral ... 1_p1_Topic

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 22:23 


26/09/17
333
спасибо! если не получится довести до ума вариант while-цикла с решателем, то вернусь к этому варианту.

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение15.10.2023, 01:00 


26/09/17
333
Уфф! Ларчик просто открывался - задал верхнюю границу для переменных и solve выдал все готовые наборы решений!
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
% === Составляем уравнение и получаем множество ВСЕХ решений
% в неотрицательных целых =================

% === Input Data ==========
n=30;
k=[4 5 5 6];

% ==== Algorithm =====
if max(k)>n
    disp 'k не может быть больше n'
    return
end
% == создаем переменные и налагаем на каждую общие условия
X=sym('x',[1 length(k)], 'integer');
for i=1:length(X)
    assumeAlso(X(i)>-1)
    assumeAlso(X(i)<=floor(n/k(i)))
end
% == составляем уравнение ===
eq=k(1)*X(1);
for i=2:length(X)
    eq=eq+k(i)*X(i);
end
disp 'Уравнение:'
eq
% ===+ Решаем ===============    
S=solve(eq==n,X);
% % === Извлекаем ====================
C=struct2cell(S);
c=size(C{1});
res=zeros(c(1),length(k));
for i=1:length(X)
    res(:,i)=C{i};
end
res

 Профиль  
                  
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение30.10.2023, 10:40 


26/09/17
333
Dedekind в сообщении #1613427 писал(а):
maximkarimov
Посмотрите вот тут
https://www.mathworks.com/matlabcentral ... 1_p1_Topic

Реализовал этот способ. Он оказался на порядок быстрее, чем решатель solve. Спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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



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

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


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

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