MATLAB Cell数组到单个变量

时间:2011-11-03 15:16:01

标签: arrays matlab variables cell

我目前有一个我正在批量运行的功能。它将结果输出到单元阵列。我想将单元格数组中的每个输出导出到它们自己的变量。

因此我有一个变量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

有什么想法吗? 感谢。

4 个答案:

答案 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