【问题标题】:Matlab poison and figuresMatlab毒药和数字
【发布时间】:2011-09-18 14:48:00
【问题描述】:

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,因为它似乎仍然强制它到顶部?

【问题讨论】:

    标签: image matlab variables plot screen-capture


    【解决方案1】:

    (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) Matlab 有时会出现特定于 OSX 的问题,因为它们仍在调试一些非常基本的东西(OSX 版本曾经是在 X-Windows 中运行的 Linux 版本,并且它们一直在在过去的几年里致力于改变这一点)。

    【讨论】:

    • 非常感谢,这太棒了^_^
    • 以防万一其他人看到这个“私人”,应该有一个小写的“p”
    • @Twig:您应该向 MathWorks 报告问题 #4 - 他们不会修复他们从未听说过的错误。
    • 对于 (3) 我使用的是轴柄,但是当我查看保存的电影时,在窗口被移动的帧中,它显示了一些窗口,以及下面的一些内容。
    • @Twig:哎呀,对不起。这是您必须作为父级传递的轴句柄。我正在更新答案。
    【解决方案2】:

    Point (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);
    

    关闭它很重要,否则它不会保存图像。显然也不会受到屏幕保护程序问题的影响。

    【讨论】:

    • 图形最好也有'Resize','off'选项,否则如果调整窗口大小会报错。
    猜你喜欢
    • 2012-05-02
    • 2017-09-19
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 2017-08-07
    相关资源
    最近更新 更多