Matlab毒药和数字

时间:2011-06-20 11:20:27

标签: image matlab variables plot screen-capture

3 Matlab问题

1 - 有没有人知道是否有相当的

#pragma GCC poison variable_name
在matlab中

,即如果它在代码中发现从此时开始使用variable_name,它会导致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 个答案:

答案 0 :(得分:8)

(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被覆盖,它会触发对象的delete方法并抛出错误,如果有索引尝试或算术操作,有一般错误。

(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)Matlab有时会出现OSX特有的问题,因为它们仍在调试一些非常基本的东西(OSX版本曾经是在X-Windows上运行的Linux版本,而且它们已经被努力改变过去几年的情况)。

答案 1 :(得分:0)

Point(3& 4)是因为我使用getframe来获取图像,这迫使窗口被带到frount,所以它可以做一个截图。我现在已经找到了一个使用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);

关闭它很重要,否则它不会保存图像。显然也没有屏幕保护程序问题。