首页 文章

Matlab毒药和数字

提问于
浏览
3

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 回答

  • 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版本,他们一直在努力改变这是最近几年) .

  • 0

    点(3和4)是因为我使用getframe来获取图像,这迫使窗口被带到frount,所以它可以做截图 . 我现在通过使用http://www.mathworks.com/help/techdoc/ref/avifile.addframe.html找到了一个解决方案,它远远优于getframe,因为它可以采用"figure or axis handle 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);
    

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

相关问题