Здесь о глюках
Глюки
Сообщений 1 страница 11 из 11
Поделиться22007-06-11 15:09:40
Глюк, совершенно фантастический (в 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'
Поделиться32007-06-11 16:15:58
Да. Действительно! Спасибо. Учтем.
Поделиться42007-06-11 16:29:50
А у тебя есть этот эффект?
Поделиться52007-06-12 12:34:39
Да. Проверила. Есть.
Поделиться62007-06-19 13:36:44
Еще один глюк, точнее даже, не глюк, а логика, отличная от общеринятой. Если пользоваться функцией contourf, то заявлена возможность вручную задавать вектор значений, определяющих цвета. Но это во многом фикция. Посмотрите на график функции
sin(y*x/10) для векторов [-1:.5:1] и [-5:.5:5]. Они отличаются только вводящей в заблуждение полоской colorbar. Поэтому, если вы хотите построить несколько графиков в одном масштабе, то вектора для colobar надо для каждого вычислять отдельно и цвета задавать в соответствии. Иначе получается обман, причем не всегда столь очевидный как в примере с синусом.
Поделиться72007-06-19 13:41:41
Надь, а мне кажется, что это соответствует всей остальной логике плотиков МАТЛАБА. Здесь каждый плотик рисуется отдельно и масштаб для него отдельный. Опции для одного subplot не должны зависеть от опций другого.
Поделиться82007-06-19 13:45:59
Оль, я немного о другом - о несоответствии реального масштаба заявленному. То есть, в самой команде на построение картинки в одном случае идет
contourf(x,y,z, [-5:.5:5])
и по идее весь плот должен быть желто-зеленым,
а в другом
contourf(x,y,z, [-1:.5:1])
и он должен разползтись по всей шкале.
А на самом деле оба графика получаются одинаковыми, то есть matlab вообще никак не реагирует на значения аргумента, точнее берет из него только шаг (в данном случае 0.5), а шкалу все равно растягивает от максимума до минимума.
Поделиться92007-06-19 15:21:29
Да. Значение аргумента нужно только для colorbar. Но это довольно легко обойти - сделай в двух массивах, по которым строятся картинки, одинаковые максим. и миним. значения. По одной точке в начале и конце массива. На графике ты одну точку и не заметишь. Тогда colorbar совпадут, а картинки будут отображать содержание массивов.
Поделиться102007-06-19 15:25:46
Это понятно, что так можно, хотя и нехорошо все равно.
А вот программный вариант решения той же проблемы.
_________________________________
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
Поделиться112011-09-27 20:32:34
Не глюк, но довольно неожиданная проблема в одной из последних версий. Они там в некоторых функциях по умолчанию включили тип single, но большая часть функций вывода с ним не работает. Когда поймёшь, в чём дело, проблема пустяковая, но сходу можно не сообразить. Рецепт понятный - переводить этот самый single into double с помощью одноимённой функции.