Eval是循环中的成员

时间:2017-01-31 17:42:54

标签: matlab

我有6个不同的数组(双),有不同的大小,名为practice1,practice2,...,practice6,我需要相互比较以检查它们是否包含相同的数字/值。我正在尝试使用ismember和eval函数进行循环,如下面但是我得到错误“未定义函数'eval'用于'logical'类型的输入参数。如果有人可以帮我解决这个问题,我将不胜感激!

allvariables = who('practice*')
for i=1:6
eval(ismember(allvariables{i}, allvariables{i+1}))

我的循环的另一个问题是,如上所述,我只是将当前的练习与下一练习进行比较,而不是将所有练习与其他练习进行比较。可能有一种更简单的方法来做这个没有循环或循环,涵盖所有可能性?

1 个答案:

答案 0 :(得分:2)

我想我知道这里发生了什么。您需要仔细构建字符串,然后eval整个事物,或eval变量名称,然后调用ismember

以下是一些例子:

%First some setup
practice_x= [1 2 3];
practice_y = [2 3 4];
practice_z = [1 4 5];
allvariables = who('practice*')
%    allvariables =
%      3×1 cell array
%        'practice_x'
%        'practice_y'
%        'practice_z'

%Option 1
for ix = 1:(length(allvariables)-1)
    eval(['ismember('  allvariables{ix} ', ' allvariables{ix+1} ')'])
end

%Option 1a (same as 1, but IMHO slightly easier to work with and explain on SO)
for ix = 1:(length(allvariables)-1)
    strTemp = ['ismember('  allvariables{ix} ', ' allvariables{ix+1} ')'];
    %When ix = 1, the strTemp variable contains the string below.
    %    strTemp =
    %    ismember(practice_x, practice_y)
    eval(strTemp )
end

%Option 2, use `eval` on the variable names directly
for ix = 1:(length(allvariables)-1)
    ismember(  eval(allvariables{ix}),   eval(allvariables{ix+1})   )
end

%For this example, all of these options result in the following output
%    ans =
%      1×3 logical array
%       0   1   1
%    ans =
%      1×3 logical array
%       0   0   1

标准的迂腐警告:

涉及将信息存储在变量名称中的问题,强制将这种类型的变量名称操作作为数据,通常意味着整个代码的构造方式是,压力大,难以使用。

这很有效。这与Matlab记录的功能一致。但是在这段代码中,有一些关于如何处理和存储数据的强反模式。