您好我正在尝试编写一个函数,该函数读取某种类型的电子表格并从其数据中动态创建向量,然后将所述向量返回到工作区。
我的xlcs由行构成,在第一行中有一个字符串,它应该成为矢量的名称,其余行包含构成矢量的数字。
这是我的代码:
function [ B ] = read_excel(filename)
%read_excel a function to read time series data from spreadsheet
% I get the contents of the first cell to know what to name the vector
[nr, name]=xlsread(filename, 'sheet1','A2:A2');
% Transform it to a string
name_str = char(name);
% Create a filename from it
varname=genvarname(name_str);
% Get the numbers which will make up the vector
A=xlsread(filename,'B2:CT2');
% Create the vector with the corect name and data
eval([varname '= A;']);
end
据我所知,矢量是corectly创建的,但我没有想法如何将它返回到工作区。
优选地,解决方案应该能够返回不确定的向量nr,因为这只是一个原型,我希望函数能够立即返回用户选择的nr个向量。
更准确地说,创建了矢量varname我可以在脚本中使用它,如果我添加:
eval(['plot(',varname,')'])
它将绘制矢量,但出于我的目的,我需要将矢量varname返回到工作空间,以便在脚本运行后保持不变。
答案 0 :(得分:2)
我认为你正在寻找evalin
:
evalin('base', [varname '= B;']);
(这不会正常工作;但请继续阅读)
但是,我强烈建议不要使用它。
它通常不易出错,通常被认为是良好的做法,事实上,具有可预测的功能结果非常常见。
从各种角度来看,非常不希望有一个操作超出其自身范围的数据的函数(即,在另一个工作空间而不是它自己的工作空间中),更不用说将不可预测的数据分配给不可预测的变量名。这不必要地难以调试,维护,并且不太可用。此外,在其他功能中使用此功能并不是指不了解您的功能的人会认为它的功能。
为什么不像结构一样使用smoething:
function B = read_excel(filename)
...
B.data = xlsread(filename,'B2:CT2');
B.name = genvarname(name_str);
end
然后,您总是与输出(B
)具有相同的名称,其中包含相同的数据(B.data
),其name
也可用于动态引用其他内容(即, A.(B.name)
)。
答案 1 :(得分:1)
因为这是一个函数,所以需要将创建的变量传递给输出变量。我建议您通过结构执行此操作,因为您不知道要预先输出多少变量。因此,请将eval
行更改为:
% Create the vector with the correct name and data
eval(['B.' varname '= A;']);
现在你应该有一个名为B
的结构,它在运行带有等于动态创建的变量名的字段名的函数后在工作空间中持久存在。比如说一个varname
是X
,您现在可以在工作区中以B.X
的形式访问它。
但是你应该仔细考虑这个代码设计,动态创建变量名称不太可能是最好的方法。
答案 2 :(得分:1)
evalin
的替代方法是函数assignin
。它的功能不如evalin
,但完全符合您的要求 - 在工作区中分配变量。
用法:
assignin('base', 'var', val)