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

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

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

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

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

dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
slice.m и искать не надо было, просто "type slice" в комстроке - матлаб тебе сам его покажет.
 
Сетка там непрозрачная из-за её отрисовки оператором surface() - это реально встроенная функа, в ней ты уже ничего не поправишь.
alpha вообще ни при чём, она на прозрачность для surface() не влияет.
 
Выхода вижу два:
 
1) Писать самому что-то по подобию slice(), по ходу заменяя вызовы surface() на свои же самописные функи по отрисовке такой сетки, какой тебе нужно. Жутко муторно, тормоза обеспечены 100%, и не факт что не заглючит где-нибудь...
 
2) Делать в лоб - поточечно строить plot3() и тут же set() на его свойства (с целью правильной раскраски) - по мне так проще...

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

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

Цитата:
alpha вообще ни при чём, она на прозрачность для surface() не влияет.

я уже опух и от прозрачности и от других параметров...
нашёл подходящую конфигурацию:

Код:
set(h, ...
      'EdgeColor','none',...
      'FaceColor','interp',...
      'FaceAlpha','interp',...
      'AmbientStrength', 0,...
      'DiffuseStrength', 0,...
      'SpecularStrength', 0)


Цитата:
2) Делать в лоб - поточечно строить plot3()

я так и думал...
только думал пересчитать значеняи F() в свой цветовой диапазон. тем более, что это можно сделать извне
не подскажешь, кстати, как сделать свой colormap ?
я взял за основу пару внешних (pink и hot)
Код:
function p = testpal(m)
if nargin < 1, m = size(get(gcf,'colormap'),1); end
p = sqrt((gray(m) + 2*hot(m))/3);
но понимания организации так и не получил...
 

Цитата:
plot3() и тут же set() на его свойства (с целью правильной раскраски)

можно здесь подробнее, что слать в set(h,...), а то я не понимаю?

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



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

Цитата:
но понимания организации так и не получил

а для понимания сделай

Код:
mymap=colormap

теперь mymap есть матрица 64х3, каждая строка = [R/256 G/256 B/256] соотв. элемента палитры.
Т.е что-то вроде такого:
это для стандартной:
Так что можешь цвета для своего colormapа хоть руками задавать, хоть по какому хочешь алгоритму...

Цитата:
function p = testpal(m)  
if nargin < 1, m = size(get(gcf,'colormap'),1); end  
p = sqrt((gray(m) + 2*hot(m))/3);  

А здесь просто смешиваются палитры "gray" и "hot" экзотики ради. Конструкция if nargin < 1, m = size(get(gcf,'colormap'),1); end попросту присваивает переменной m "умолчальный" размер палитры (64 ячейки), если размер явно не задаётся руками.
 

Цитата:
можно здесь подробнее, что слать в set(h,...),  

Ну вот пример простой:
v(x,y,z) - твоя ф-ция, например v=x*exp(-x2-y2-z2); x,y,z от -2 до +2
Подробнее...
А проблемка в том, что так подпись у colorbar покажет не настоящие значения ф-ции v, а тупо номера цвета в палитре 1..64
Можно со свойствами colorbar поковыряться... пока не смотрел.

upd
поправил colorbar. Всё очень просто оказалось.

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

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

Цитата:
А здесь просто смешиваются палитры "gray" и "hot" экзотики ради
это я понял, подсмотрел, сам и смешал...
 

Цитата:
матрица 64х3
а больше 64 можно? как?
так можно?

Код:
function p = testpal(m)  
if nargin < 1, m = size(get(gcf,'colormap'),1); end  
m = 128;
p = sqrt((gray(m) + 2*hot(m))/3);

 
Добавлено:

Цитата:
А проблемка в том, что так подпись у colorbar покажет не настоящие значения ф-ции v, а тупо номера цвета в палитре 1..64
это на легенде что ли?
мне это не нужно, подписи к осям, тики на осях -- всё...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 20:47 02-04-2012
dimitriy7



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

Цитата:
а больше 64 можно? как?  

 
Можно, конечно.
Вот так, например:

Код:
 
m = 128;  
p = sqrt((gray(m) + 2*hot(m))/3);
colormap(p);
 

последняя строчка нужна для правильной замены дефолтной палитры на твою собственную
 
Добавлено:
поправил палитру и colorbar заодно, вроде работает...
 
akaGM
А у тебя что? Покажи?

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

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

Цитата:
поправил палитру и colorbar заодно, вроде работает...

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

Цитата:
А у тебя что? Покажи?

что показать?
не покажу, у меня палитра красивая, я решил её за (С) :)
 
на самом деле я очень благодарен, спасибо...
 
если можно ещё вопросы:
 
1) v(m,n,k)=x(m)*exp(-x(m)^2-y(n)^2-z(k)^2);
варнинг, что v меняет размер на каждом проходе.
херить?
 
2) set(hc(1)...
а почему хэндл всегда элемент массива, это принципиально?
я всегда скаларом ставил
 
3)
vmin=+Inf;
vmax=-Inf;
     if v(m,n,k)<vmin // это чтобы NANов не было?
         vmin=v(m,n,k);
 
что ж это тогда за бесконечность такая +-Inf , если возможны оп. отношения?
 
4) size(z,2)
почему так размер определяется?
 
ещё глюк какой-то непонятный:
 
если поменять палитру в интерактиве на какую-нибудь предопределённую, то колорБар перерисовывается, а сама фигура -- нет...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 00:28 03-04-2012 | Исправлено: akaGM, 00:58 03-04-2012
dimitriy7



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

Цитата:
варнинг, что v меняет размер на каждом проходе

Ну просто матлаб любит ругаться на динамические массивы (типа выделение памяти под каждый новый элемент медленнее, чем сразу нужный объём зарезервировать. Оно вообще так и есть ) Можешь просто забить, а можешь для пущей красоты сделать массив v статикой -
Код:
v=zeros(size(x,2),size(y,2),size(z,2));
сразу после объявления x,y,z
 

Цитата:
почему хэндл всегда элемент массива

Привычка. Потому что хэндл в общем виде как раз массив, просто в некоторых случаях (plot3 тот же самый) этот массив из одного элемента. Подробнее...
 

Цитата:
что ж это тогда за бесконечность такая  

Самая обычная бесконечность, +Inf=1/0 и -Inf=-1/0. И отношения самые обычные, математические (любое число меньше +Inf и больше -Inf, ещё их в любых выражениях можно использовать наравне с обычными числами). А ещё есть +0 и -0, представь

Цитата:
это чтобы NANов не было?

Это чтоб правильно найти мин. и макс. элементы матрицы v
 

Цитата:
почему так размер определяется?  

А потому что size() возвращает несколько значений, для вектора-строки, например, вернёт 2 числа: "1" и его длину. Для вектора-столбца наоборот, его длину и "1" - поэтому ПРАВИЛЬНО определять кол-во элементов в векторе НАДО БЫ так:
Код:
max(size(z))
. Можешь поправить, если хочешь...
 

Цитата:
ещё глюк какой-то непонятный

Чтоб фигура перерисовалась, надо руками соотв. команду выполнить, уж не помню какую... set() на хэндл для axis (вроде на него, ибо он контейнер для всего в пределах коорд. осей) с каким-то параметром... Ну не помню.

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

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

Цитата:
А вот у slice - уже настоящий массив

а что я тогда вот этим делаю?
  h = slice(x,y,z,v,xslice,yslice,zslice);
  set(h, ...)
 

Цитата:
Самая обычная бесконечность, +Inf=1/0 и -Inf=-1/0. И отношения самые обычные, математические (любое число меньше +Inf и больше -Inf, ещё их в любых выражениях можно использовать наравне с обычными числами).

:)
знаешь анек "курс: зюйд-зюйд-вест"?
ты мне теоретически объясняешь, а мы находимся в случае "численных расчётах"

Цитата:
А ещё есть +0 и -0, представь

да ты что! :О
или лучше вот такой смайл
lim x->+0
 

Цитата:
Чтоб фигура перерисовалась, надо руками соотв. команду выполнить, уж не помню какую... set() на хэндл для axis (вроде на него, ибо он контейнер для всего в пределах коорд. осей) с каким-то параметром... Ну не помню.

э-э-э
я в гуях поменял через меню палитру (я так и делал), а потом должен лезть в коде и что-то менять?
круто...
 
пойду-ка я лучше в Origin...
 
http://originlab.com/www/products/GraphGallery.aspx?cat=3D&sort=Newest
элемент (3, 4) -- "это то что вам нужно"

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



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

Цитата:
а что я тогда вот этим делаю?  
  h = slice(x,y,z,v,xslice,yslice,zslice);  
  set(h, ...)  

Ровно то же, что и  
  h = slice(x,y,z,v,xslice,yslice,zslice);  
  set(h( : ), ...)
Т.е. применяешь set() ко всем экземплярам хендлам объекта разом.
 

Цитата:
ты мне теоретически объясняешь

Ну а как на практике реализовано я и не знаю. Вроде какие-то попытки символьных вычислений, примерно как в maple... Как там +-бесконечность и +-0 во внутреннем представлении выглядят - никому неизвестно, но использовать-то их можно, коль уж они стандартом языка определены )
 

Цитата:
я в гуях поменял через меню палитру  

Ну правильно, в гуях ты поменял не палитру, а только картинку для её отображения на форме (а где-то в глубинах матлабного интерпретатора от этого случился set() на хэндл colorbar с соотв. параметрами). А собственно фигура принадлежит объекту axis, который ничего не знает о твоих манипуляциях с colorbar, имеет собственный хэндл (и не один!) и управляется совсем другим набором параметров (а ещё есть colormap - вот он и задаёт цвет и для colorbar, и для axis с фигурой)

Цитата:
а потом должен лезть в коде и что-то менять?

Можно на форму вывести кнопку "перерисовать", и по факту её нажатия делать set() на хендл axis (или colormap) для перерисовки фигуры.
 
Добавлено:

Цитата:
пойду-ка я лучше в Origin...

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

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

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

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

во блин, я тоже нафортранил и в матлаб, а там не всё так просто и тоже надо писАть...
 

Цитата:
Но вот по языку - матлаб всё-же гораздо удобнее показался. Только это много лет назад было, может доработали Origin в смысле собственного языка...
не хочу я больше программить, затрахали детали...
всегда использовал Оригин только для конечных результатов...
кстати, до сих пор Оригин у нас не продают...
матлабы-адобы-фотожопы купили, а этот до сих пор патчу-крякаю...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 20:17 03-04-2012
dimitriy7



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Жаль, что не продают...
 
А матлаб - он как-бы и не для рисования предназначен, вполне себе самостоятельный язык программирования, с упором на серьёзную математику. Какая-то базовая графика есть (уровня "посмотреть быстренько - что это там насчитали?") - и то хорошо...
Если б не тормознутость (байт-код + виртуальная машина для него, найди 10 отличий от Явы), была бы хорошая альтернатива тому же фортрану.
 
Удачи тебе с Origin

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
да понятно всё про матлаб...
 
ага, спасибо, сейчас поковыряюсь, но если что про матлаб обращусь...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 21:40 03-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
нет, всё-таки Оригин -- это для конечного графика, уж очень муторно, оперативно ничего не сделаешь если не программить. так что решил доделать в матлабе что смогу, а там посмотрим.
надеюсь на дальнейшую помощь и ещё раз спасибо...

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 02:28 04-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
а вот скажи, я правильно понимаю идею форматов?
 
slice(x, y, z, V, xslices, yslices, zslices)
 
V -- функция (x, y, z), при этом эти (x, y, z) в вызове используются как параметры для оцифровки осей, т.е. просто для задания области определения (генерят объём V),
а инфо-срезы уже смотрятся по x-y-zslices.
а c plot3() (x, y, z) -- выполняют роль и того и другого, мы их и "визуализируем"
 
?

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



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Ух, тёмное это дело - матлабная графика...
 

Цитата:
slice(x, y, z, V, xslices, yslices, zslices)

x,y,z - спецматрицы, задающие полностью сетку для построения картинки. Это НЕ области определения по соотв. осям.
Собственно, перед slice(x, y, z, V, xslices, yslices, zslices) должна стоять конструкция вот такого вида:

Код:
 
xi=[-2:0.2:2];
yi=[-3:0.5:3];
zi=[-10:1:20];
[x,y,z] = meshgrid(xi,yi,zi);  
 

вот тут как раз вектор xi задаёт область определения по оси X от -2 до 2 с шагом 0.2, и т.п.
А [x,y,z]=meshgrid(xi,yi,zi) генерирует некие особые матрицы x,y,z , задающие сетку для дальнейших построений, матрицы эти многомерные, и кроме компонентов из xi,yi,zi содержат ещё кучу служебной информации. Формат этих матриц см. "help meshgrid".
V можно строить хоть от xi,yi,zi (поэлементно, в цикле), хоть от x,y,z (будут вычислены сразу все элементы V разом).
 
xslices, yslices, zslices - задают секущие плоскости по осям X,Y,Z соотв.
Пример:

Код:
 
hs = slice(x, y, z, V, [-2:1:2], [], [-10 0]);
 

построит 7 секущих плоскостей:
5 штук перпендикулярно оси X (при x=-2 x=-1 x=0 x=1 x=2) с хендлами от hs(1) до hs(5);
ни одной перпендикулярно Y;
и 2 перпендикулярно Z  (z=-10 и z=0) с хендлами hs(6) и hs(7).
 

Цитата:
plot3() (x, y, z) -- выполняют роль и того и другого, мы их и "визуализируем"  

А plot3() просто строит точку (или какой-нибудь значок) по заданным координатам, и ему надо скормить 3 скаляра и, при желании, значок для вывода.

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

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

Цитата:
Ух, тёмное это дело - матлабная графика...

ага...
зато теперь стало ясно...
хотя у меня и было так записано:
Код:
 
  X = -8:.5:8;
  Y = -8:.5:8;
  Z = -8:.5:8;
  [x,y,z] = meshgrid(X, Y, Z);
  V = x.*exp(-x.^2-y.^2-z.^2);
  xslices = -4:0.5:4;
  yslices = -4:0.5:4;
  zslices = -4:0.5:4;
 
  h = slice(x, y, z, V, xslices, yslices, zslices);

 

Код:
 
  for m = 1:1:sx
    for n = 1:1:sy
      for k = 1:1:sz
        r = sqrt(x(m)^2+y(n)^2+z(k)^2) + eps;
        V(m,n,k) = sin(r) / (r);
      end;
    end;
  end;
%%%  
  r = sqrt(x.^2+y.^2+z.^2) + eps;
  V = sin(r)./ r;
это не одно и тоже?
 
боюсь, что plot3() не подойдёт из-за того что ни черта не видно "унутри" и очереёдность вывода здесь не поможет...
значит, будем сечь на слайсы :)

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



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

Цитата:
это не одно и тоже?

Не совсем. Вот это:
 r = sqrt(x.^2+y.^2+z.^2) + eps;  
 V = sin(r)./ r;
вообще не будет работать при разном размере областей определения по x,y,z. Для параллельного вычисления всех компонентов разом надо делать так:

Код:
 
 [x,y,z]=meshgrid(x,y,z);
 r = sqrt(x.^2+y.^2+z.^2) + eps;
 V = sin(r)./r;
 

И это будет идентично такой конструкции:

Код:
 
  for m = 1:1:max(size(x))
    for n = 1:1:max(size(y))
      for k = 1:1:max(size(z))
        r = sqrt(x(m)^2+y(n)^2+z(k)^2) + eps;
        V(n,m,k) = sin(r) / (r);
      end;
    end;
  end;
  [x,y,z]=meshgrid(x,y,z);
 

 - обрати внимание на "перепутанные" индексы при вычислении V(n,m,k) - это у матлаба такое своеобразное понимание ориентации X и Y.
 
Если планируется использовать базовую графику со скаларными аргументами (скаларные варианты plot, plot3, line, patch - т.е. то, что не требует предварительного применения meshgrid), то считать надо только в цикле с "правильным" порядком индексов (т.е. V(m,n,k) )
 
Если надо использовать матричную графику (т.е. ф-ции, требующие спецматриц от meshgrid, вроде slice, surf, mesh, contour3, матричные варианты plot, plot3), то надо либо ПЕРЕД применением meshgrid() считать в цикле с "НЕправильным" порядком индексов (т.е. V(n,m,k) ), либо ПОСЛЕ применения meshgrid() считать без цикла все значения разом.

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

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

Цитата:
это у матлаба такое своеобразное понимание ориентации

:)
 
в своих 2D-мучениях нашёл решение
 
F = F';
 
чёрт, начинаю думать об ещё какой-нибудь сторонней графике
MathGL не щупал?

Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 20:53 04-04-2012
dimitriy7



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

Цитата:
в своих 2D-мучениях нашёл решение  
 F = F';  

В 2D всё же F = F.'; чтобы транслятор не искал комплексных чисел там, где их и нет
А в 3D посложнее - выделять двумерную XY-матрицу, .' на неё, и вписать обратно. Попроще вроде никак...
 

Цитата:
MathGL не щупал?

Не, не слышал даже
 
Слышал, что нечто под названием "mathematica" умеет красиво рисовать, но сам не пробовал.

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimitriy7
F = F';
вроде и так работает, лучше не трогать...
это у меня после
F = fscanf(fp, '%f', [numcols, numrows]);
по-другому не работает...
хотя, может это потому что я с порядком [numcols, numrows] ошибаюсь :)
 

Цитата:
Не, не слышал даже

на, послушай:
http://mathgl.sourceforge.net/ru/index.html

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