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

MATLAB: Loop through the values of a list from 'who' function

我的工作区中有一长串变量。 首先,我正在使用 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

如果您想要有关变量的详细信息,可以使用 whos 代替,这将 return 包含(除其他外)维度 (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

获取此信息的直接方式。正如我在评论中指出的那样,我建议您退后一步,不要一开始就生成那些动态命名的变量。

您可以动态访问结构,而不必求助于缓慢且不安全的方法 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会是一个struct,每个字段会对应一个你存入的变量'tmp.mat':

>> S

S = 

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

将变量从工作区写入 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