0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
1 | |
Matlab до v. 2013 Чрезмерное количество выходных аргументов функции16.02.2018, 17:17. Показов 2558. Ответов 15
Метки нет (Все метки)
Добрый день!
Столкнулся с проблемой, там, где не ожидал: в разработанной файл-функции Matlab почему-то слишком много выходных аргументов, поэтому она отказывается запускаться (хотя ранее встречался с информацией о том, что в MatLab нет ограничений по количеству выходных переменных). Когда запускаю функцию при помощи ярлыка, то ПО пишет данную проблему (на 1-й картинке, ярлычок выделен зелёным цветом). Если же вручную копирую синтаксис (тот, который "под ярлыком") в командное окно (на первом скриншоте, но ниже; синим цветом выделен текст вызова функции), то проблем с вызовом нет, всё рассчитывается, однако в конце снова высвечивается ошибка (скриншот 2). И в ошибке есть отсылка к 6-й строке файла, хотя сам код более 200 строк, т.е. это априори некорректное описание проблемы. И ещё нюанс, когда запускаю код из отладчика M-файлов, то всё без проблем работает, но возвращает, по понятным причинам, только один выходной аргумент - "ans". Как быть в этом случае? Неужели придётся усложнять код и "запихивать" многие выходные аргументы в матрицы и массивы с целью уменьшения их количества? Или разбивать его на несколько функций? Я сознательно программировал "не сокращая код", т.к. сам математический алгоритм сложный, чтобы потом легко разобрался в нём при чтении. P.S. Мне на самом деле столько аргументов на выходе и не нужно, многие из них выводятся внутри кода и используются только для промежуточных вычислений, но когда в самом скрипте начинаю удалять лишние, то при запуске выводится ошибка о том, что переменная, фигурирующая в коде, не указана в перечне выходных аргументов в заголовке функции. P.P.S. Вызов функции в командной строке с меньшим числом выходных аргументов тоже не помогает, возвращаются числа, рассчитываемые по порядку в скрипте, а не поместившиеся в это количество (самые нужные, те, что в конце скрипта) просто "пропадают". Заранее спасибо за помощь!
0
|
16.02.2018, 17:17 | |
Ответы с готовыми решениями:
15
Создайте функцию, которая принимает переменное количество входных аргументов и возвращает переменное количество выходных Странное расположение в памяти аргументов функции с неизвестным количество аргументов Можно ли наращивать количество аргументов функции? Можно ли вернуть количество аргументов функции? Из-за подсветки в новой версии Creator не видно выходных аргументов. Как исправить? |
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
16.02.2018, 18:34 | 2 |
Согласен, тоже так делаю.
Попробуйте описать их как глобальные и тогда их значения можно смотреть в WORKSPACE. и после отладки опять описать их как локальные
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
|
16.02.2018, 18:37 | 3 |
без самого кода трудно дать ответ
0
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
||||||
19.02.2018, 17:03 [ТС] | 4 | |||||
P.S. А какой кнопкой нужно осуществлять цитирование с указанием автора цитируемого сообщения (как в ответе Nick07), что-то не разобрался ? Добавлено через 4 минуты Ладно, попробую, но строчек там много...
До 172 строки проблем не было, всё считалось и возвращалось. Проблемы начались, когда повводил много вспомогательных переменных для расчёта компонентов матрицы градиентов (строки 183-196). P.S. Разобрался с цитированием Добавлено через 8 минут Ещё немного подумал: в принципе можно прописать сохранение интересующих меня параметров в файлы формата .xls по ходу выполнения кода и таким образом запускать его из редактора, не заботясь о возвращении результатов функции в Matlab, но всё же представляет научно-спортивный интерес сделать весь алгоритм цельным, не "ущербным" модулем.
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
||||||
19.02.2018, 17:22 | 5 | |||||
Сообщение было отмечено Vitalii_Iurch как решение
Решение
в вашем случае не вижу необходимости выписывать выходные параметры функции, т.к. в работе только одна функция
закомментируйте первую и последнюю строки кода, и считайте на здоровье, вся рабочая информация будет храниться в workspace переизбыток комментариев, но это на вкус и фломастеры разные... рекомендация по комментариям, если они необходимы, то
1
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
||||||
20.02.2018, 08:29 | 6 | |||||
Сообщение было отмечено Vitalii_Iurch как решение
Решение
Вот так писать очень не аккуратно
Например dN*_dx - это один из элементов массива данных Если пользователь введет n_reinf_levels=0, то ряд выходных параметров (n_bars_*, d_reinf_bars) будет неопределённ, что приведет к ошибке. Также если n_reinf_levels>1, то количество стержней в предыдущих слоях Вас похоже не интересует, Вы сохраняете для дальнейшего использования только данные по последнему армированному слою, причем даже не сохраняя номер этого слоя. Кроме этого, такой стиль приема параметров от пользователя перестали применять уже лет 20-25 назад (как только закончилась эпоха MS-DOS), да и в программах на MS-DOS и в других неграфических системах стремились уйти от получения данных от пользователя по запросу если данных более 5-7. Это вполне объяснимо, при вводе параметров пользователь довольно часто допускает ошибки, и ввести без ошибок 20-30 данных подряд довольно сложно. Хуже всего то, что если ошибка не грубая (когда программа не может определить что данные введены ошибочно), то пользователь вполне реально может не заметить ошибку ввода данных и в результате получит неверный результат расчета не зная об этом. Вам желательно перейти на ввод данных из файла, например из EXCEL, тогда вероятность ошибки в данных значительно уменьшится. Кроме этого, при тестировании расчетных блоков Вам потребуется самому осуществить запуск своей программы от 20 до нескольких сотен раз ( в зависимости от сложности расчетов), так что Вы на себе проверите насколько удобен реализуемый Вами способ ввода параметров.
1
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
20.02.2018, 16:54 [ТС] | 7 |
Да, действительно, так проблема решается, спасибо !
Для чтения без необходимости перемещения экрана вправо-влево - да, но мне пока так удобнее, т.к. лечге вычленять смысловые части кода в плане шагов расчёта. А чем это чревато? Я же прямым образом указал, начальный номер цикла, шаг и конечный номер ? Т.к. я, видимо, не до конца понимаю все механизмы возвращения результатов в ПО: в случае, если я убираю в заголовке функции из перечня возвращаемых результатов хоть какие-нибудь величины, напротив которых есть знак "=" в коде, то получаю при запуске скрипта ошибку ввиду того, что какие-то из рассчитываемых параметров не определены (в случае вызова функции из командной строки с полным указанием набора необходимых мне выходных параметров). Очевидно, это и случалось при запусках, о которых я писал в первом посте темы! Спасибо. Используя промежуточное решение: добился обхода этой проблемы, но в будущем, конечно, нужно будет подумать над этим местом. Верно, мне не важно сколько было стержней и в каком слое, для меня главное, что с учётом этого количества при каждом "пробеге" цикла для обсчитываемого слоя приводились (усреднялись) параметры упругости с учётом количества стержней. А они записываются как соответствующие элементы соответствующих массивов (3 массива для 3-х видов модулей упругости). Возможно это не совсем "строгий" алгоритм, но пока не хочу заниматься оптимизацией этого места - проверить бы общую релевантность расчётов. Здесь полностью согласен, но пока просто из-за объёма умений не могу этого сделать. Параллельно с написанием кода изучаю книгу по Matlab, надеюсь, в скором времени разберусь, как импортировать данные из ячеек для расчётов. Добавлено через 18 минут Увидел дальнейшее развитие этой ошибки; его не устраняет даже комментирование первой и последней строк (если мы заходим в данный цикл, но в каком-либо из направлений арматуры нет, то позже, я пытаюсь присвоить элементам соответствующего массива значения переменной, которая даже не рассчитывалась). Буду дальше мозговать над алгоритмом. В общем, как оказалось, проблема не в количестве входных и выходных параметров...
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
|
20.02.2018, 17:22 | 8 |
Vitalii_Iurch, начните упрощение своего кода с ввода данных...
для начала сделайте некий контрольный вариант (можно парочку) с необходимыми параметрами, чтобы не вводить каждый раз вручную данные, на них отработайте свой алгоритм.. а потом можно отлаженный алгоритм применить (проверить) на большом множестве вариантов.
1
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
||||||
21.02.2018, 08:56 | 9 | |||||
Вы на время выполнения цикла потеряли исходное значение этой величины и не можете ее использовать в теле цикла. Но и это не все, Вы также не можете прервать выполнение цикла, если это будет необходимо по какой-то причине. В некоторых языках такие действия вообще приведут к ошибке, поэтому желательно соблюдать "культуру" программирования.
Также примите как "культуру" программирования в MATLAB инициализацию в начале функции всех выходных переменных, это исключит ошибки, когда при некотором наборе значений переменных может возникнуть не определение выходных переменных как у Вас. В MATLABe есть такой инструмент как структура данных (возможно я не по "матлабовски" называю это, но это очень похоже на структуры в С и С++). Заводите переменную, например D_NAME и в ней определяете поля
есть функция xlsread, там все очень просто.
1
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
21.02.2018, 16:08 [ТС] | 10 |
Уже занялся, спасибо
Хорошо, принял к сведению. Вот здесь не понял, как эти 2 вещи связаны: используемая переменная и прерывание цикла. Вот здесь, честно скажу, не понял. Не являюсь программистом, поэтому не до конца понял, что такое определение структуры и зачем это нужно. Т.е. мы каждой возвращаемой функции переменной присваиваем её возможные значения и, таки образом, можем даже не указывать её при вызове функции, в случае, если в данный момент нам эта переменная не нужна ?
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
22.02.2018, 08:36 | 11 |
При выполнении цикла может возникнуть необходимость прервать дальнейшее выполнение цикла командой break, тогда переменная цикла не примет конечного значения и останется такой, какой была при прерывании цикла.
Структура, это по сути некоторый блок данных, возможно разных типов. При этом при передаче данных в функцию и возврате данных из функции указывается не весь перечень данных, а только обозначение структуры - D_NAME (это не совсем точно по матлабовским канонам, но верно по сути). Таким образом избегается большой перечень параметров в функцию и из функции. А большие списки параметров могут приводить к ошибкам, когда Вы случайно перепутаете порядок следования переменных в списке. Здесь я Вас не понял. Возможно Вы пишите про начальную инициализацию возвращаемых переменных некоторыми значениями по умолчанию, она необходима что бы исключить вероятность возникновения ошибок при выполнении программы с различными наборами данных.
1
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
22.02.2018, 13:33 [ТС] | 12 |
Ээх, придётся по всему скрипту переименовывать..
А, т.е. мы как бы в теле кода записываем все выходные параметры в данную структуру, присваиваем ей имя и далее при вызове функции указываем не весь перечень выходных переменных, а просто это имя структуры? Хотя тогда не понятно, как это работает с входными параметрами: в моём случае они не нужны, но обычно это же значения независимых переменных в форме цифр, которые каждый раз меняются, как их тогда записать в эти структуры?
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
||||||
22.02.2018, 14:07 | 13 | |||||
пример
1
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
22.02.2018, 15:51 [ТС] | 14 |
Спасибо!
В целом проблема, послужившая причиной создания темы решена, но всё-таки остаётся вопрос: ну вот не нужны мне в Workspace многие переменные (особенно их финальные значения, получаемые по окончанию циклов), это промежуточные данные (например строки строки 183-201 кода в сообщении № 4), как их тогда не выводить, если их нельзя убрать из списка выходных параметров (т.е. из строки 4 кода), чтобы не получить ошибку? Нужно все "запаковывать" во вложенные функции, что бы на самом верхнем уровне остались только необходимые мне величины в качестве возвращаемых результатов?
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
|
22.02.2018, 15:54 | 15 |
в конце программы сделать чистку
https://www.mathworks.com/help... clear.html
0
|
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
|
|
22.02.2018, 23:12 [ТС] | 16 |
0
|
22.02.2018, 23:12 | |
22.02.2018, 23:12 | |
Помогаю со студенческими работами здесь
16
Переменное количество аргументов в функции ( зацикливание ) Как задать переменное количество аргументов для чужой функции? Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов Как в данной ситуации использовать функции, получающие и возвращающие различное количество аргументов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |