首页 > 解决方案 > 带有表达式的单元格到matlab中的数值数组

问题描述

我有一个带有数学表达式的单元格,我想将其转换为数值数组。它看起来如下:

a = {};
a{1,1} = '0.55';
a{2,1} = '0.25 + 0.50';

现在我想收到结果(但最好没有 for 循环):

b(1) = 0.55;
b(2) = 0.75;

我怎样才能有效地实现这一目标?

标签: matlab

解决方案


b = cellfun(@eval,a);将创建一个b与元胞数组大小相同的数组a,每个值都是元胞数组中相应字符串的评估。

a = {};
a{1,1} = '0.55';
a{2,1} = '0.25 + 0.50';

a=repmat(a,1000,20); %Make it big for performance evaluation

tic
b1 = cellfun(@eval,a);
toc %0.662187 seconds

另一种选择是制作一个大字符串表达式,以便由于内部循环eval而只调用一次而不是多次。cellfun这不太安全,因为元胞数组中的异常值a可能会导致代码崩溃,而它可能只是在上面的代码中产生NaN

tic
% add a comma separator after each value
strCell = cellfun(@(x) [x ','],transpose(a),'uniformoutput',false);
% add a semicolon separator at the end of each row
strCell(end,:) = cellfun(@(x) [x(1:end-1) ';'], strCell(end,:), 'uniformoutput',false);
% remove the last separator
strCell{end}=strCell{end}(1,end-1);
% evaluate the line
b2=eval(['[' strCell{:} ']']);
toc %0.313738 seconds but sometimes more than 1 seconds

推荐阅读