在Matlab中strcat之后的未定义函数或变量

时间:2016-03-29 16:05:36

标签: regex string matlab function string-concatenation

我有一个函数向量,我试图从中获取子集。我将向量中的函数转换为单元格数组,以便我可以将其索引。这是脚本

coeff1 = 1;
coeff2 = 2;
coeff3 = 3;

F = @(x) [... 
coeff1*x(1)*x(4); ...
0; ...
coeff2*x(3); ... 
coeff3*x(7)*x(3) ...
];

G = regexp(func2str(F), ';|\[|\]', 'split');
H = cellfun(@str2func, strcat(G{1}, G(2:end-1)), 'uni', 0);
F2 = @(y)cellfun(@(x)x(y),H(2:4));
F2(rand(1,4));

但是在测试函数时出现错误。它说coeff1未定义。不知何故,解析的函数无法识别它。可能有什么不对?

提前致谢。

1 个答案:

答案 0 :(得分:0)

正如@excaza所指出的那样,使用str2func生成的函数无法访问不在其工作空间中的变量。这会让您有两种解决方法:您可以使用strrepregexprep替换变量名称的出现:coeff1变为(1)等等。或者您可以存储所有系数在一个向量中并将它们作为第二个参数传递:

F = @(x, coeff) [... 
coeff(1)*x(1)*x(4); ...

这仍然让你处理字符串操作和函数句柄操作。两者都很昂贵且容易破裂。由于您的原始问题略有不同,并且特别提到您想要速度,让我建议采用不同的方法:

您的示例表明F具有特定结构,即每行是x的特定元素的乘积,乘以常量。 在这种情况下,您可以根据需要使用此结构生成函数句柄:

% Coefficient matrix for x. Along second dimension, 
% elements of x will be multiplied with these factors. Along third
% dimension, these products (multiplied with the corresponding item of C)
% will be summed. 

X = logical(cat(3, ...
  [  1     0     0
     0     1     1
     0     0     0
     0     0     0
     1     1     1  ], ...
  [  0     0     0
     1     0     0
     0     0     0
     0     0     1
     0     0     0  ]));

% coefficients for each row
C = [ 1, 2
      2, 3
      0, 0
      0, 3
      1, 0 ];

% anonymous function generating anonymous functions for particular rows
F = @(ind) @(x) sum(C(ind, :) .* squeeze(prod(bsxfun(@times, X(ind, :, :), x) + ~X(ind, :, :), 2)), 2);
% get one of those functions and test
newF = F([2 4]);
x = [1, 2, 3];
newF(x)

allF = F(':');
allF(x)

所以F是给定行索引的函数,它返回一个可以应用于x的函数。