我有6个不同的数组(双),有不同的大小,名为practice1,practice2,...,practice6,我需要相互比较以检查它们是否包含相同的数字/值。我正在尝试使用ismember和eval函数进行循环,如下面但是我得到错误“未定义函数'eval'用于'logical'类型的输入参数。如果有人可以帮我解决这个问题,我将不胜感激!
allvariables = who('practice*')
for i=1:6
eval(ismember(allvariables{i}, allvariables{i+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记录的功能一致。但是在这段代码中,有一些关于如何处理和存储数据的强反模式。