MATLAB:从'who'函数循环遍历列表的值

Ben*_*nsa 1 matlab list variable-length-array

我的工作区中有很长的变量列表.首先,我发现了我可能对使用该who函数感兴趣的潜在变量.接下来,我想遍历此列表以查找每个变量的大小,但是who仅将变量的名称作为字符串输出.

我如何使用此列表来引用变量的值,而不仅仅是名称?

谢谢,

list = who('*time*')
list = 

    'time'
    'time_1'
    'time_2'

for i = 1:size(list,1);
    len(i,1) = length(list(i))
end

len =

     1
     1
     1
Run Code Online (Sandbox Code Playgroud)

Sue*_*ver 8

如果你想要有关变量的详细信息,你可以使用whos它来返回一个包含(以及其他)维度(size)和存储大小(bytes)的结构.

至于获取,您可以使用,eval 但不建议这样做,您应该考虑使用具有动态字段名称而不是动态变量名称的单元格数组或结构.

S = whos('*time*');

for k = 1:numel(S)
    disp(S(k).name)
    disp(S(k).bytes)
    disp(S(k).size)

    % The number of elements
    len(k) = prod(S(k).size);

    % You CAN get the value this way (not recommended)
    value = eval(S(k).name);
end
Run Code Online (Sandbox Code Playgroud)


And*_*eak 7

@Suever很好地解释了获取此信息的直接方法.正如我在评论中提到的那样,我建议您退后一步,并且不要生成那些动态命名的变量.

您可以动态访问结构,而不必诉诸缓慢和不安全eval:

timestruc.field = time;
timestruc.('field1') = time_1;
fname = 'field2';
timestruc.(fname) = time_2;
Run Code Online (Sandbox Code Playgroud)

以上三个赋值对于结构都是有效的,因此您可以通过动态生成字段字符串来处理单个数据结构的字段.唯一的限制是字段名称必须是有效的变量名称,因此字段的第一个字符必须是字母.

但是这里有一个快速的方法可以解决你自己陷入的陷阱:在.mat文件中保存你的工作区(以及相关部分),并将其重新读入.你可以通过一种方式为你提供一个结构恰好是您的变量名称的字段:

time = 1;
time_1 = 2;
time_2 = rand(4);
save('tmp.mat','time*'); % or just save('tmp.mat')
S = load('tmp.mat');
Run Code Online (Sandbox Code Playgroud)

之后S将是一个结构,每个字段将对应于您保存到的变量'tmp.mat':

>> S

S = 

      time: 1
    time_1: 2
    time_2: [4x4 double]
Run Code Online (Sandbox Code Playgroud)