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

时间:2016-10-24 19:39:12

标签: 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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

@Suever nicely explained获取此信息的简单方法。正如我在评论中指出的那样,我建议您退后一步,不要生成那些动态命名的变量。

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

timestruc.field = time;
timestruc.('field1') = time_1;
fname = 'field2';
timestruc.(fname) = time_2;

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

但是这里有一个快速走出你自己陷阱的陷阱:在.mat文件中保存你的工作区(以及相关部分),然后再读回来。你可以这样做的方式将为您提供一个结构,其中的字段恰好是您的变量名称:

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

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

>> S

S = 

      time: 1
    time_1: 2
    time_2: [4x4 double]

答案 2 :(得分:0)

将变量从工作区写入csv文件的示例:

clear;

% Writing variables of myfile.mat to csv files
load('myfile.mat');
allvars = who;
for i=1:length(allvars)
    varname = strjoin(allvars(i));
    evalstr = strcat('csvwrite(', char(39), varname, '.csv', char(39), ', ', varname, ')');
    eval(evalstr);
end