Матлаб яд и цифры - PullRequest
       24

Матлаб яд и цифры

3 голосов
/ 20 июня 2011

3 вопроса Matlab

1 - Кто-нибудь знает, существует ли эквивалент

#pragma GCC poison variable_name

в Matlab, то есть он вызывает Matlab к ошибке, если он находит переменную_имя, используемую с этого момента в коде?

Два других менее связанных вопроса, так как я до сих пор не могу в это поверить.

2 - есть ли в любом случае связать такие команды, как

imagesc(I1_avg_crop, [bg_value multiplier2*std_value+bg_value]);

к фигуре, в частности, за исключением

set(0,'CurrentFigure',fig3);
imagesc(I1_avg_crop, [bg_value multiplier2*std_value+bg_value]);

непосредственно перед этим?

3 - может ли функция getframe () (или аналогичная) на самом деле получить то, что на фигуре, вместо того, чтобы «делать снимок экрана» ?, поскольку это не так хорошо работает при перемещении окна фигуры?

(я редактирую чей-то код, и я новичок в Matlab, поэтому я заранее извиняюсь, если это глупые вопросы, просто я не могу найти то, что я хочу в документации)

РЕДАКТИРОВАТЬ: Дополнительный вопрос В инструкции написано

set(0,'CurrentFigure',h);

Делает фигуру h текущей, но не изменяет ее видимость или расположение по отношению к другим фигурам. Это все еще применяется в Mac OS X, поскольку кажется, что оно все еще заставляет его идти вверх?

Ответы [ 2 ]

8 голосов
/ 20 июня 2011

(1) Нет, «естественным» образом отравить переменную невозможно.Однако вы можете сделать следующий обходной путь: Определить класс следующим образом:

classdef poison 
   properties (SetAccess=private)
      varName
   end
   methods
     function obj = poison(varName)
        obj.varName = varName;
     end
     function delete(obj)
        error('attempting to overwrite ''%s''',obj.varName)
     end
   end
end

Затем вы можете вызвать variable_name = poison('variable_name') и получить тот же эффект - если variable_name будет перезаписан, он вызовет метод удаления объектаи выдает ошибку, если при попытке индексации или при арифметических манипуляциях возникают общие ошибки.

(2) Вы можете явно установить родителя изображения (передать дескриптор оси, который вы можетенапример, получить по axHandle = axes('Parent',fig3);) в вызове функции, что позволяет избежать вызова фигуры.Однако вы не можете сделать это и , чтобы установить масштабирование карты цветов.Таким образом, вы должны либо использовать

imshow(I1_avg_crop,[bg_value multiplier2*std_value+bg_value],'Parent',axHandle);

, либо, если у вас нет доступа к набору инструментов для обработки изображений, вам нужно использовать image

image(I1_avg_crop, 'CDataMapping','scaled','Parent',axHandle);
set(axHandle,'clim',[bg_value multiplier2*std_value+bg_value])

(3)Если вы вызываете getframe с ручкой осей, она должна иметь возможность захватывать содержимое осей - если вы не переместили фигуру на второй экран, и в этом случае она не будет работать.Кстати, я заметил getframe, что в прошлом у него были проблемы с OSX, например, с пристыкованными фигурами.

(4) Время от времени возникают определенные для OSX проблемы с Matlab, поскольку они все еще отлаживают некоторые из самых простых вещей (версия OSX раньше была версией Linux, работающей в X-Windows, и ониработаю над изменением этого в течение последних нескольких лет).

0 голосов
/ 21 июня 2011

Точка (3 и 4) была из-за того, что я использовал getframe для получения изображения, и это заставило окно быть выведенным на экран, чтобы он мог сделать скриншот. Теперь я нашел решение, используя http://www.mathworks.com/help/techdoc/ref/avifile.addframe.html, который намного превосходит getframe, поскольку он может принимать «ручку фигуры или оси h».

fig4 = figure('Position',[450 300 400 round(400*aspect_ratio)],'Name','fig4'); % figure 4
aviobj = avifile(movie_name,'compression','None');
    for i = 1:N
        aviobj = addframe(aviobj,fig4);
    end
aviobj = close(aviobj);

важно закрыть его, так как иначе оно не сохранит изображение. Также, видимо, не страдает от проблемы с заставкой.

...