2014 dxdy logo

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

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




 
 Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:00 
Пусть длина вектора A из натуральных чисел определяет число вложенных циклов, а каждая его компонента - число итераций в соответствующем цикле. Как создать скрипт или функцию в зависимости от произвольного A?

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:52 
Аватара пользователя
Код:
while any(A)....

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 10:55 
Инициируем вектор итераций единицами и далее инкрементируем на 1 его максимальную по номеру $i$ компоненту, которая меньше $A_i$

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 12:28 
Ух ты! Никогда так не делал, спасибо огромное! Будем посмотреть!)

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 17:30 
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 
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 
Аватара пользователя
maximkarimov в сообщении #1613424 писал(а):
Подскажите, плиз, как найти место где нужно указать 'true'?

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

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 21:53 
maximkarimov в сообщении #1613424 писал(а):
specify the 'ReturnConditions' value as 'true'


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

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

-- 13.10.2023, 21:58 --

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

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 22:16 
maximkarimov
Посмотрите вот тут
https://www.mathworks.com/matlabcentral ... 1_p1_Topic

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение13.10.2023, 22:23 
спасибо! если не получится довести до ума вариант while-цикла с решателем, то вернусь к этому варианту.

 
 
 
 Re: Matlab: как создать переменное число вложенных циклов
Сообщение15.10.2023, 01:00 
Уфф! Ларчик просто открывался - задал верхнюю границу для переменных и 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 
Dedekind в сообщении #1613427 писал(а):
maximkarimov
Посмотрите вот тут
https://www.mathworks.com/matlabcentral ... 1_p1_Topic

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

 
 
 [ Сообщений: 12 ] 


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