Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » помогите с Matlab

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12

Открыть новую тему     Написать ответ в эту тему

dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а блоков end-function нет что ли?

В смысле?
 

Цитата:
и что с разделением переменных и их областью видимости?

По умолчанию так:
У каждой функи - свои локальные переменные, не видны даже в пределах одного m-файла (переменные главной ф-ции тоже принажлежат только ей и не доступны подфункциям - только через явную передачу входных/выходных параметров).
 
Можно руками объявить любую переменную глобальной - делается так: сразу после заголовка ф-циии ставится оператор  
global ИМЯ_ПЕРЕМЕННОЙ;
тогда она станет доступна по ВСЕМ функам, где стоит такая команда (в том числе и из других m-файлов - поэтому используй такую возможность с осторожностью, мало ли где ещё уже объявлена глобальная переменная с таким же именем?...) + будет доступна непосредственно в матлабной комстроке после соотв. объявления
(и будет существовать в памяти в единственном экземпляре, естественно).
Пример: mainproc.m
 
PS
Ф-ции объявить глобальными нельзя, снаружи всегда видна только главная, у которой имя совпадает с именем m-файла. Остальные функи - видны только внутри m-файла, при этом никакой иерархии у них нет, описывать можно в любом порядке (но после главной), вызывать их друг из друга можно.
структура .m-файла:

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 23:36 07-04-2012 | Исправлено: dimitriy7, 16:55 09-04-2012
MorSe

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
а блоков end-function нет что ли?  

Нету. Начало объявления новой функции будет концом предыдущей.

Цитата:
что с разделением переменных и их областью видимости?

Тут всё стандартно.
 
dimitriy7
Опередил .

Всего записей: 8886 | Зарегистр. 29-09-2002 | Отправлено: 23:39 07-04-2012 | Исправлено: MorSe, 23:42 07-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ок, спасибо за ответы...
хреново, но переживаемо...
 
уточнение:

Цитата:
Начало объявления новой функции будет концом предыдущей.
но иногда в конце файла стоит завершающий end
т.е. можно опускать, но можно и ставить?

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 02:14 08-04-2012 | Исправлено: akaGM, 02:15 08-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
стоит завершающий end  

Он завершает именно ФАЙЛ, а не функцию.  
Всё, что после него, попросту игнорируется - чтобы можно было в конец файла написать какой-нибудь громадный комментарий, не утруждая себя % перед каждой строчкой.
Соответственно, если поставишь его МЕЖДУ функциями -- все функи, что окажутся ниже, станут недоступны
 
 
 
Добавлено:
akaGM, кстати:

Цитата:
херово когда переменные не описаны

Только тут "не описаны" не переменные, а размер матриц.
А переменные как раз описаны - в данном случае как 'double', + никто не мешает самому описать если хочется:
Список стандартных типов:
Примеры:
a=uint8(25)
b=int16([10:2:20])
b=double([15i; 56; 4+12i])
c=logical(true)
и т.п.
 
Узнать тип переменной x можно:
s=class(x); % возвращает в s строку с названием типа переменной x

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 02:23 08-04-2012 | Исправлено: dimitriy7, 03:12 08-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
спасибо за ликбез :)
 
1) если хочу управлять объектом извне и/или из обработчика, то пользоваться только set/get по дескриптору?
 
2) функа не возвращает ничего...
что лучше:
 
2.1)
вставить houtput (при условии что, основной рисовалкой является slice() )
 
function houtput = aaa()
...
houtput = slice();
 
так?
 
или
 
2.2) получить хэндл в головной
 
hmain = findobj(gcf, 'tag', tag_name);
 
gcf -- это что? главная фига на экране, каррент граф фига?

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 04:10 08-04-2012 | Исправлено: akaGM, 04:13 08-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
то пользоваться только set/get по дескриптору

Угу
 

Цитата:
что лучше:

Вроде лучше 2.1, ибо проще.
 
gcf = дескриптор самого главного граф-объекта по имени figure (т.е. собственно окна со всеми кнопочками и рюшечками) -- а тебе надо со всем этим хозяйством возиться?... Обычно такое используют для управления именно окном - свернуть/развернуть/закрыть... ну или чтобы применить команду refresh для перерисовки всей figure разом, вместе со всем содержимым. А если хочешь управлять каким-то конкретным объектом - то проще по его собственному дескриптору.  
 
 
Добавлено:
PS
gcf возвращает хэндл именно текущего экземпляра figure. А если открыто несколько граф-окон, то что делать будешь?
 
По-хорошему, открытие окна для граф. построений надо делать:
hg=figure();
в hg(1) сразу получишь хэндл открытого окна (пока пустого) - если он нужен. Так хотя бы сможешь руками указать, какое окно тебе нужно в данный момент (если окон несколько)
А gcf при нескольких окнах - может банально послать тебя не к тому окну, какое тебе надо, а просто к тому, какое открыто позже других...

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 15:23 08-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
было
 
function slice3d(varargin)
...
slice(x,y,z,v,[min(x) max(x)],[min(y) max(y)],[min(z) max(z)]), shading flat;
 
 
переделал на
 
function hslice = slice3d(varargin)
...
hslice = slice(x,y,z,v,[min(x) max(x)],[min(y) max(y)],[min(z) max(z)]);
shading flat; %это относится к последней операции?
 
верно?

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 15:48 08-04-2012 | Исправлено: akaGM, 15:50 08-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
это относится к последней операции?

1) Коротко - ДА.
2) Подробно - shading относится к текущему хэндлу(ам) для объекта(ов) surface, а т.к. slice() использует для отрисовки именно массив surface-ов и возвращает их хэндлы, то ДА.
3) Дословно из хелпа матлаба:

Код:
 
    SHADING controls the color shading of SURFACE and PATCH objects.
...
    SHADING is an M-file that sets the EdgeColor and FaceColor properties
    of all SURFACE objects in the current axes. It sets them to the
    correct values that depend upon whether the SURFACE objects are
    representing meshes or surfaces.
 


Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 19:43 08-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
хорошо, спасибо...
но тут вопрос не о шадинге как таковом, а том правильно ли я переделал
конструкцию
slice(), shading flat;
в
slice();
shading flat;

 
и ещё больше меня волнует вопрос о правильности передачи хэндла из функции...
почему-то
 
main.m
  global global_h;
 
slice3d.m
function slice3d()
  global global_h;
...
  global_h = slice();
 
не работает
 
не вижу global_h в головной программе...
что не так?

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 20:40 08-04-2012 | Исправлено: akaGM, 20:42 08-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
правильно ли я переделал  
конструкцию  
slice(), shading flat;  
в  
slice();  
shading flat;  

А это почти одно и то же - можно писать несколько команд в одну строку через запятую, правило такое:
 
proc1(), proc2();
-- то же самое что
proc1()
proc2();
 
в отличие от
 
proc1(); proc2();
-- то же самое что
proc1();
proc2();
 
 

Цитата:
main.m  
  global global_h;  
 
slice3d.m  
function slice3d()  
  global global_h;  
...  
  global_h = slice();  
 
не работает  

 
Только что проверил - вот такое работает:
 
main.m

Код:
 
function main
  global global_h;
  slice3d;
  disp(global_h);
 

 
slice3d.m

Код:
 
function slice3d
  global global_h;
  global_h = 123;  
 

 
1) Переменная будет недоступна (точнее, равна []), пока ей какое-нибудь значение не присвоишь. Т.е. у тебя main не видит переменную, т.к. там она только ОБЪЯВЛЯЕТСЯ, а реальное присвоение значения (и выделение памяти) идёт в slice3d(). Вот сначала вызови slice3d() из main - и появится твоя переменная.
 
2) И слово "function main" в головной программе не забыл? А то тогда действительно переменная не будет видна из main, ибо её область видимости тогда переадресуется из main в матлабную комстроку...

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 22:03 08-04-2012 | Исправлено: dimitriy7, 22:18 08-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7

Цитата:
И слово "function main" в головной программе не забыл?
конечно забыл, бо не знал...

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 23:10 08-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Ты чего, заголовок функции написать забыл, что ли?

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 23:16 08-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в вызываемой написал, а в вызывающей и не знал что нужно, ни в одном примере не видел...
как в сях, типа main() что ли? теперь буду писать...

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 00:40 09-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
типа main() что ли?

Не, просто у каждой функции должен быть заголовок -- и у главной ф-ции в m-файле он должен совпадать с именем самого m-файла.
Вроде такого:
 
my_func.m
Код:
 
function [выходные параметры] = my_func (входные параметры)
...тра-ля-ля...

 
и я вроде ж писал про структуру m-файла в общем виде:
mainproc.m

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 16:53 09-04-2012 | Исправлено: dimitriy7, 16:53 09-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
ну может и писал, только во всех примерах, кот. я видел (включая демонстрашки из хелпа), заголовков нет...
вот, мой стартовый код для slice(), и ничего, работает...
короче, пора книжки читать :)

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 17:15 09-04-2012 | Исправлено: akaGM, 17:17 09-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
заголовков нет...  

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

Цитата:
короче, пора книжки читать

А они есть, книжки по матлабу? У нас он не особо популярен, на русском что-то нормальных учебников не видел (плохо искал?).
Найдёшь - поделишься?
 
Добавлено:
ps
тьфу, ну вот почему у тебя двоеточие со скобкой нормально выглядят, а у меня в цитате твоей же фразы - как смайл в колпаке?

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 17:30 09-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7

Цитата:
А они есть, книжки по матлабу?

у меня родные руководства + бумажный Смоленцев ("вейвлеты в Matlab" и "связь Matlab С++")
+
а из электронных
matlab 7: численные методы и "Spectral Methods in Matlab Lloyd N. Trefethen"
а вообщe их до фигища..
щас...
вот 73 штуки, например, может не очень свежие, но всё-таки:
http://itbookz.ru/catmath.php
 

Цитата:
тьфу, ну вот почему у тебя двоеточие со скобкой нормально выглядят, а у меня в цитате твоей же фразы - как смайл в колпаке?

чек-бокс внизу

Цитата:
Разрешить смайлики?

граф.смайлики маздай (с) мой :)

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 17:52 09-04-2012 | Исправлено: akaGM, 18:29 09-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вот 73 штуки, например, может не очень свежие, но всё-таки:  
http://itbookz.ru/catmath.php

А, спасибо, посмотрю.
Только там на русском мало - а на английском вроде и хелпа матлабного достаточно...
 

Цитата:
чек-бокс внизу  

а я думал - это общефорумная настройка для отображения смайлов вообще... а оно, оказывается, работает для отдельных сообщений :)

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 18:32 09-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7

Цитата:
Только там на русском мало

а на фиг они тебе вообще? тематические уже нужны...
 
как запретить масштабироваться элементам гуи при изменение размеров окна?

Всего записей: 24200 | Зарегистр. 06-12-2002 | Отправлено: 18:46 09-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати, самые универсальные книжки - по версиям 6.0-6.5-7.0 (они же R12-R13-R14).
 
Учебники для более ранних - даже и не смотри, с R12 отчасти поменяли синтаксис и структуру m-файлов и механизм работы с подфункциями (и очень сильно переделали виртуальную машину, структуру байт-кода, и самое главное - всю графику).
 
С другой стороны, последняя адекватная версия - 7.5 (R2007b) - в более поздних опять что-то переписали, примеры из старых учебников часто не работают (особенно с символьными вычислениями)
 
У тебя какая версия-то?
 

Цитата:
как запретить масштабироваться элементам гуи при изменение размеров окна

Не знаю... Это от версии сильно зависит.
Может проще вообще запретить изменять размеры окна?

Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 18:48 09-04-2012 | Исправлено: dimitriy7, 18:56 09-04-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » помогите с Matlab


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru