相关疑难解决方法(0)

Matlab中的作用域如何工作?

我刚刚发现(令我惊讶)调用以下函数

function foo()
if false
   fprintf = 1;
else
  % do nothing
end
fprintf('test')
Run Code Online (Sandbox Code Playgroud)

给出和错误Undefined function or variable "fprintf".我的结论是变量的范围是在运行之前确定的(在我有限的理解中如何解释计算机语言,特别是Matlab的工作原理).有人能给我一些背景信息吗?

编辑

我上面忘记提到的另一个有趣的事情是

function foo()
if false
   fprintf = 1;
else
  % do nothing
end
clear('fprintf')
fprintf('test')
Run Code Online (Sandbox Code Playgroud)

生产Reference to a cleared variable fprintf.

matlab scope

12
推荐指数
2
解决办法
5348
查看次数

MATLAB错误?为函数和变量使用相同名称时出现"未定义的函数或变量"错误

在MATLAB中使用函数作为"常量"变量的偶尔会很方便.但是当我最近使用此功能时,我遇到了意外错误.当我在下面运行MWE时,Undefined function or variable 'a'.尽管功能在同一个文件中清晰可用,但我得到了错误.当我发表if声明时,错误消失了.这似乎暗示MATLAB预先解释a为变量,即使永远不会到达变量赋值行,忽略了存在同名函数的事实.这是一个MATLAB错误还是某种想要的行为?

这是MWE:

function matlabBugTest(  )
    if false
        a = 'foo';
    end
    a
end
function b = a()
    b = 'bar';
end
Run Code Online (Sandbox Code Playgroud)

跟进:

我知道有意为变量和函数使用相同的名称似乎很奇怪,所以我将举例说明这可能有用.例如,您可能希望使用函数来存储某些常量(如文件路径),但也希望能够在找不到该函数时使用不同的值.这种情况可能如下:

if ~exist('pathConstant.m', 'file')
    pathConstant = 'C:\some\path';
end
load(fullfile(pathConstant, 'filename.ext'));
Run Code Online (Sandbox Code Playgroud)

我知道语言设计决策通常是困难和复杂的,但MATLAB选择忽略同名函数的一个更不幸的后果是它破坏了函数和脚本/命令行之间的兼容性.例如,以下在脚本中运行时没有问题:

if false
    a = 'foo';
end
a
Run Code Online (Sandbox Code Playgroud)

其中函数a(如上所示)保存在自己的文件中.

matlab scope function

8
推荐指数
1
解决办法
1592
查看次数

Matlab循环:从目录加载东西时忽略变量定义

我是MATLAB的新手并尝试在循环中运行循环.ID例如,我事先定义了一个变量ID={'100'}.在我的循环中,然后我想转到ID的目录,然后在那里加载matfile.但是,每当我加载matfile时,突然ID定义会被所有可能的ID(目录中ID 100所有的所有文件夹)覆盖.这是我的代码 - 我也试过fullfile,但到目前为止没有运气:

ID={'100'}

for subno=1:length(ID)     % first loop
  try         
   for sessno=1:length(Session) %  second loop, for each ID there are two sessions   
    subj_name =  ([ID{subno} '_' Session{sessno} '_vectors_SC.mat']);
    cd(['C:\' ID{subno} '\' Session{sessno}]);
    load(subj_vec_name) % the problem occurs here, when loading, not before
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,当我检查ID的长度时,它现在不是1(一个ID,即100),但是目录中的所有可能ID都是100,并且循环再次针对所有其他可能的ID进行迭代(尽管它应该在ID 100之后停止).

variables matlab loops

0
推荐指数
1
解决办法
31
查看次数

标签 统计

matlab ×3

scope ×2

function ×1

loops ×1

variables ×1