我目前有一个我正在批量运行的功能。它将结果输出到单元阵列。我想将单元格数组中的每个输出导出到它们自己的变量。
因此我有一个变量id,它记录每一层的ID。可以按如下方式手动执行此过程:
>> output =
[300x300x2 double] [300x300x2 double] [300x300x2 double]
>> [a1,a2,a3]=deal(output{:});
a之后的数字代表ID。是否可以自动执行此命令,以便用户可以设置前缀(在本例中为:a)并自动填入id?如我所知,我可以设置如下变量,并在deal
命令中使用这些变量命名我的新变量?
>> id =
1 2 3
>> prefix =
a
有什么想法吗? 感谢。
答案 0 :(得分:2)
也许是这样的:
function dealinto(prefix, cellarray)
% DEALINTO
% USAGE
% dealinto('a', {'one', 'two', 'three'})
% Causes these variables to be set in the base workspace:
% a1: 'one'
% a2: 'two'
% a3: 'three'
for i=1:numel(cellarray)
assignin('base', [prefix num2str(i)], cellarray{i});
end
如果在上面用'caller'替换'base',变量将被写入调用函数的工作区。我不建议这样做,因为我不建议在函数内部调用没有输出参数的LOAD:任意写入运行函数的工作区并不是很安全。
如果你需要这样的东西在函数内部使用但不希望它只是编写变量willy nilly,你可以做与LOAD相同的事情,这是为了给你一个结构,其字段是变量你会否则产生。
答案 1 :(得分:2)
您可以将自己的自定义表达式构建为字符串,然后使用eval()
(或evalin()
进行评估,如果它在函数中,并且您希望将输出返回到工作区)。
function deal_output(output, id, prefix)
id = id(:);
vars = strcat(prefix, cellstr(num2str(id)))';
myexpr = ['[', sprintf('%s,', vars{1:end-1}), vars{end}, '] = deal(output{:})'];
evalin('caller', myexpr)
>> output = num2cell(1:3);
>> id = 1:3;
>> prefix = 'a';
>> deal_output(output, id, prefix)
a1 =
4
a2 =
5
a3 =
6
同时查看FileExchange上的join.m
文件,以避免丑陋的sprintf
。
答案 2 :(得分:0)
你真的必须将它们输出为完全独立的变量吗?在结构中使用动态字段名称会更有效,因为这样可以避免使用eval()
语句。参见MATLAB blogs for avoiding eval()
在这种情况下
m = length(output);
[a(1:m).data] = deal(output{:});
这将返回一个结构数组,添加长度计算,因此它适用于不同大小的输出单元阵列。
每个数组都可以使用ID号单独访问。
a(1).data
a(2).data
a(3).data
答案 3 :(得分:0)
我似乎无法添加评论所以我正在以问题的形式添加答案^ _ ^
预先创建名称列表并使用genvarname在调用者工作区中检查它们是不是更好?
Names = cell(1,numel(data))
for idx = 1:numel(data)
Names{idx} = [Prefix, num2str(idx)]
end
Names = genvarname(Names,who)
dealinto(Names, data)
会阻止在现有工作空间中创建任何无效名称,然后需要将dealto修改为
function dealinto(Names, Values)
for idx = 1:length(Names)
assignin('caller', Names(idx), Values(idx))
end