gpt4 book ai didi

matlab - 为什么在函数中使用其内容后*可以导入包?

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:36 26 4
gpt4 key购买 nike

我正在使用 MATLAB R2014b 并有一个问题,我将通过以下示例进行说明。

MWE 可以按以下方式制作或 download it as a .zip file here .

在您的路径上创建一个包含四个函数文件的包文件夹 +test:

+test
a.m
b.m
c.m
d.m

a.m 的内容:

function a
disp 'Hello World!'

b.m的内容:

function b
a

如果从命令行运行 b,则必须先导入 test 包(import test.*)或运行test.b.

运行 b 将导致错误,因为函数 b 的范围不包含函数 a。我们必须先导入它才能使用。为此,我创建了 c.m:

function c
import test.*
a

现在运行 c 工作正常。

现在我的问题。如果我将 c.m 更改为(保存在 d.m 中):

function d
a
import test.*

即导入命令在调用包函数 a 之后 发出。运行 d 仍然可以正常工作,就好像导入命令在 d.m 中的位置无关紧要一样。导入似乎发生在调用函数 a 之前,在 d.m 中发生在导入之前的行上。

为什么会这样。这是预期的行为吗?它的用途是什么? MATLAB 如何以及以什么顺序读取 .m 文件并处理它?还有更多题外话,但总的来说:与 MATLAB 相比,如何用不同的语言处理导入包,命令的顺序重要吗?

我根据评论得出的先发制人的结论:最好的做法可能是只在 MATLAB 代码的开头或附近使用导入函数。这使得导入的内容在整个元素(例如函数)中都可用,清晰可见。它还可以防止错误假设,即在导入之前,内容尚不可用或指的是具有相同名称的不同事物。

最佳答案

MATLAB 在计算函数之前执行静态代码分析以确定该函数使用的变量/函数。 import 语句的评估是此静态代码分析的一部分。这是设计使然,因为如果您导入 一个包然后使用它的函数,MATLAB 需要在静态代码分析期间知道这一点。因此,无论将 import 语句放在什么地方,它的效果都与放在函数开头的效果相同。

您可以通过查看import输出 轻松测试它,它将列出所有当前导入的包。

+test/a.m

function a(x)
disp(import)
import test.*
end

test.a()

% test.*

这就是为什么 the documentation states 不要import 语句放在条件中。

Do not use import in conditional statements inside a function. MATLAB preprocesses the import statement before evaluating the variables in the conditional statements.

function a(x)
disp(import)
if x
import test.*
else
import othertest.*
end
end

test.a()

% test.*
% othertest.*

避免这种行为的唯一方法是让静态代码分析器确定(毫无疑问)import 语句不会被执行。我们可以通过让我们的条件语句只是一个逻辑值来做到这一点。

function a()
disp(import)
if true
import test.*
else
import othertest.*
end
end

test.a()

% test.*

就与其他语言相比的导入而言,这实际上取决于语言。例如,在 Python 中,您必须在访问模块内容之前放置 import 。根据我的经验,这是典型案例,但我敢肯定也有很多异常(exception)。每种语言都会有所不同。

关于matlab - 为什么在函数中使用其内容后*可以导入包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37386754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com