Виртуальные cеминары и неформальное общение по солнечно-земной физике. Солнечный ветер, магнитосферы, магнитные возмущения, ... 2007 - Международный гелиофизический год

Форум по солнечно-земным связям

Объявление

Добро пожаловать на форум по солнечно-земной физике! Заходите, читайте, регистрируйтесь, пишите!
PS После регистрации Вы увидите больше разделов и тем (но не мгновенно).

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Глюки

Сообщений 1 страница 11 из 11

1

Здесь о глюках

2

Глюк, совершенно фантастический (в 7-й версии точно наблюдается, про другие не знаю)

Читаем в строковую переменную число (часто бывает нужно при считывании в смешанном формате), а потом по целому уже формату считывавем ее в действительную  переменную.

Например

a='01';
b=sscanf(a, '%i');

Для переменной a последовательности 08 и 09 являются "магическими". Другие выдают при таком считывании число без лидирующего 0,

a='01', b=1;
a='07', b=7
a='18', b=18

для этих же формируется вектор-столбец вида

0
8

или

0
9

Бороться можно записью текстовой переменной без лидирующего нуля, но это лишняя операция, или считывать по формату '%f'

3

Да. Действительно! Спасибо. Учтем.

4

А у тебя есть этот эффект?

5

Да. Проверила. Есть.

6

Еще один глюк, точнее даже, не глюк, а логика, отличная от общеринятой. Если пользоваться функцией contourf, то заявлена возможность вручную задавать вектор значений, определяющих цвета. Но это во многом фикция. Посмотрите на график функции

sin(y*x/10) для векторов [-1:.5:1] и [-5:.5:5]. Они отличаются только вводящей в заблуждение полоской colorbar. Поэтому, если вы хотите построить несколько графиков в одном масштабе, то вектора для colobar надо для каждого вычислять отдельно и цвета задавать в соответствии. Иначе получается обман, причем не всегда столь очевидный как в примере с  синусом.

7

Надь, а мне кажется, что это соответствует всей остальной логике плотиков МАТЛАБА. Здесь каждый плотик рисуется отдельно и масштаб для него отдельный. Опции для одного subplot не должны зависеть от опций другого.

8

Оль, я немного о другом - о несоответствии реального масштаба заявленному. То есть, в самой команде на построение картинки в одном случае идет

contourf(x,y,z, [-5:.5:5])

и по идее весь плот должен быть желто-зеленым,
а в другом

contourf(x,y,z, [-1:.5:1])

и он должен разползтись по всей шкале.

А на самом деле оба графика получаются одинаковыми, то есть matlab вообще никак не реагирует на значения аргумента, точнее берет из него только шаг (в данном случае 0.5), а шкалу все равно растягивает от максимума до минимума.

9

Да. Значение аргумента нужно только для colorbar. Но это довольно легко обойти - сделай в двух массивах, по которым строятся картинки, одинаковые максим. и миним. значения. По одной точке в начале и конце массива. На графике ты одну точку и не заметишь. Тогда colorbar совпадут, а картинки будут отображать содержание массивов.

10

Это понятно, что так можно, хотя и нехорошо все равно.

А вот программный вариант решения той же проблемы.

_________________________________
function [t_map, f_int,c_map, v_b]=mk_cmap(bm_tot, bm_c, n_int);
% creates a colormap from the initial
% t_map -full color map
% c_map - partial colormap
% f_int - line numbers of partial map
% v_b - vecror of function values
% bm_tot - min/max of thetotal scale
% bm_c - current min.max
% n_int - number of contours
% In this variand 3 base colors - 'b', 'g', 'y' and 'r' are used
% step 1, initial map
bt_max=bm_tot(2);
bt_min=bm_tot(1);
bc_max=bm_c(2);
bc_min=bm_c(1);
n_tot=floor(n_int/3)*3+1;
bt_int=linspace(bt_min,bt_max,n_tot);
f_min=find(bc_min>=bt_int(1:n_tot-1) & bc_min<=bt_int(2:n_tot));
f_max=find(bc_max>=bt_int(1:n_tot-1) & bc_max<=bt_int(2:n_tot))+1;
f_int=[f_min,f_max];
v_b=bt_int(f_min:f_max);   
st_main=(n_tot-1)/3;
t_map=zeros(n_tot,3);
v_clr=[1:st_main:n_tot];
clr_pr={[0 0 1 ], [0 1 0], [1 1 0], [1 0 0]};
k_clr=0;
for i_clr=v_clr
    k_clr=k_clr+1;
    t_map(i_clr,:)=clr_pr{k_clr};
end
k_clr=0;
for i_clr=v_clr(1:3)
        k_clr=k_clr+1;
        i2_clr=v_clr(k_clr+1);
        v_intr=[1:st_main-1]'/st_main*[1,1,1];
        t_fr=ones(st_main-1,1)*t_map(i_clr,:);
       t2_fr=ones(st_main-1,1)*t_map(i2_clr,:);
    t_map(i_clr+1:i2_clr-1,:)=(1-v_intr).*t_fr+v_intr.*t2_fr;
end
c_map=t_map(f_min:f_max,:);

% © n_y, 2006.06.19

11

Не глюк, но довольно неожиданная проблема в одной из последних версий. Они там в некоторых функциях по умолчанию включили тип single, но большая часть функций вывода с ним не работает. Когда поймёшь, в чём дело, проблема пустяковая, но сходу можно не сообразить. Рецепт понятный - переводить этот самый single into double с помощью одноимённой функции.