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

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

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

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

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

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
напиши, плиз, отдельно как ты пересчитывал F(x,y,z) в массив цветов для палитры?

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 14:11 05-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Да обычным пересчётом диапазона vmin..vmax в 1..cm
(vmin и vmax - мин. и макс. значения ф-ции, cm - размер палитры):
Сначала надо создать палитру в map и сделать colormap(map); - если делаешь свою палитру. А если используешь стандартную - то сделать map=colormap;
Затем:

Код:
c=fix((F(m,n,k)*(cm-1)+vmax-vmin*cm)/(vmax-vmin)+0.5-eps);
- номер компоненты палитры, соответствующий конкретному значению ф-ции F
(+0.5-eps -- это из-за особенностей матлабного округления).

Код:
map(c,:,:,: );
- в свою очередь возвращает значения [R/255, G/255, B/255] для компоненты текущей палитры с номером "c"
 
И обратный пересчёт для правильной работы колорбара:

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
а ну да...
я с "с" не разобрался, думал массив, херово когда переменные не описаны...
map это отсюда: map=colormap или отдельная функция?
fix() -- округление?
 


 
а ещё не смог бы ты переделать свой код с plot3() пoд scatter3() ?

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



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
map - это просто я так обозвал переменную, в которой лежит тело текущей палитры.
 
По поводу colormap - под этим именем ДВЕ разные функи, какую применить - матлаб сам решает по входным параметрам:
1) функция colormap без входных параметров - возвращает тело текущей палитры. Пример:
Код:
A=colormap; % теперь в переменной A лежит копия текущей палитры

2) процедура colormap() берёт параметр в виде двумерной матрицы (кол-во_цветов)х3 и ничего не возвращает, а матрицу объявляет текущей палитрой. Пример:
Код:
colormap(B); % пользовательская палитра с телом в матрице B объявлена текущей

 
Работая с любой палитрой - ты используешь имя содержащей её матрицы. И она должна быть объявлена как "текущая".
Соответственно -  
если хочешь работать со стандартной палитрой - её тело надо поместить в твою переменную: ИМЯ_МАТРИЦЫ=colormap;
если хочешь свою палитру - то наоборот: создаёшь тело палитры в своей переменной, а затем объявляешь её текущей: colormap(ИМЯ_МАТРИЦЫ);
В любом случае потом работаешь с "ИМЯ_МАТРИЦЫ"
 

Цитата:
fix() -- округление?

Это отбрасывание дробной части.
Округление-то тоже есть, и не одно - в большую и меньшую стороны, с учётом знака и без - выбирай на вкус... Только запомнить все тонкости трудно, а мой fix(что-то+0.5-eps) - это опять же привычка...

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
 
map=colormap;
map(c,:,:,: ); -- конкретный цвет для отрисовки...
так?
 
не заменит ли scatter3() plot3() ?

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



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

Цитата:
map=colormap;  
map(c,:,:,: ); -- конкретный цвет для отрисовки...  
так?  

Для умолчальной палитры - так.
 

Цитата:
не заменит ли scatter3() plot3() ?

Шило на мыло, если у тебя не многоядерник с кучей памяти.  plot3 - проще и память не жрёт, зато scatter3 параллелится автоматом (правда по своему опыту - больше 3-4 потоков всё равно матлаб тут делать не станет, хоть 100500 ядер ему дай - так что особо и не ускоришься, а памяти scatter3 кушает неприлично много).

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
 
блин...
тут принципиальная вещь вылезла...
Код:
данные извне (моя счётная программа)
X = -4:.2:4;
Y = -4:.2:4;
Z = -4:.2:4;


Matlab
[x,y,z] = meshgrid(X, Y, Z)


опять моя программа
F = x.*exp(-x.^2-y.^2-z.^2);
xslices = -2:2:2;
yslices = -2:2:2;
zslices = -2:2:2;

 
строго Matlab
h = slice(x, y, z, V, xslices, yslices, zslices);
такой ощущение, что придётся прыгать промежуточно туда-сюда
что-то я с логикой запутался...
не хочу связываться с matlab'ом на уровне кода

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 19:44 05-04-2012 | Исправлено: akaGM, 19:51 05-04-2012
dimitriy7



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

Цитата:
опять моя программа  

А что она тут считает? Может, проще вот этот кусок под матлаб переписать? (или по времени выполнения критично?)
 
Добавлено:

Цитата:
не хочу связываться с matlab'ом на уровне кода

А чего так? Нормально он считает, медленно правда... И при желании можно нормальный бинарник скомпилировать, не единым байт-кодом матлаб живёт...

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

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

Цитата:
А что она тут считает?

F = F(x,y,z)
:)
 
планировалось зарядить Матлаб "на оперативно посмотреть"

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 20:35 05-04-2012 | Исправлено: akaGM, 20:37 05-04-2012
akaGM

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

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 00:26 07-04-2012 | Исправлено: akaGM, 18:29 07-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно ли несколько функций держать в одном .m файле?
или правило 1 файл == 1 функция?

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 14:06 07-04-2012 | Исправлено: akaGM, 19:32 07-04-2012
dimitriy7



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

Цитата:
можно ли несколько функций держать в одном .m файле?  

Можно.
Сначала - главная ф-ция (имя совпадает с именем .m-файла).
После - любые другие ф-ции, но они будут доступны только из главной (и не будут видны "снаружи")
Пример:mainproc.m

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ok
а блоков end-function нет что ли?
и что с разделением переменных и их областью видимости?

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 22:06 07-04-2012 | Исправлено: akaGM, 22:15 07-04-2012
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
т.е. можно опускать, но можно и ставить?

Всего записей: 24838 | Зарегистр. 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 -- это что? главная фига на экране, каррент граф фига?

Всего записей: 24838 | Зарегистр. 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; %это относится к последней операции?
 
верно?

Всего записей: 24838 | Зарегистр. 06-12-2002 | Отправлено: 15:48 08-04-2012 | Исправлено: akaGM, 15:50 08-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