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被覆盖,它会触发对象的删除方法并抛出错误,如果尝试进行索引或算术操作,则会出现通用错误。

(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窗口下运行的Linux版本,并且过去几年一直在努力改变它)。


@Twig:你应该向MathWorks报告问题#4 - 他们不会修复他们从未听说过的错误。 - Jonas
@Jonas:(2)似乎不起作用。图形窗口加载,但是它里面什么也没有放置。 - Twig
在文件imagesc.m中的“hh = image(varargin {:},'CDataMapping','scaled');”处出现错误,导致程序崩溃。错误信息请参考http://pastebin.com/kEHEdZfH。 - Twig
1
@Twig:抱歉,我的错。你需要将轴句柄作为父级传递。我正在更新答案。 - Jonas
@Twig:真的吗?我的解决方案中的命令对我使用image有效。请注意,您必须单独设置最小/最大缩放。 - Jonas
显示剩余5条评论

0

第三点和第四点是因为我使用了getframe来获取图像,这迫使窗口被带到前面,以便可以对其进行屏幕截图。现在我已经找到了一个解决方案,即使用http://www.mathworks.com/help/techdoc/ref/avifile.addframe.html,它比getframe优越得多,因为它可以使用“figure或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);

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


最好为图形也提供“Resize”、“off”选项,否则如果调整窗口大小,它会出现错误。 - Twig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接