使用`exists`和结构数组

时间:2015-10-22 22:18:28

标签: matlab struct

作业是

  

您正在测试功能性近红外(fNIR)设备和   测量每个主体能够控制计算机鼠标使用的程度   它。编写一个函数getcogdata,返回所请求的类别   请求的用户ID。如果请求的用户不存在,则返回空   矩阵。如果没有请求用户,请返回a   所有用户的值的单元格数组。

我的代码如下

function output=getcogdata(cat,id)
info=struct('id',{'33','10','48','41'},'name',{'Joe','Sally','Harry','Ann'},...
    'age',{'27','25','23','19'},...
    'height',{'5.9','6.1','5.8','6.0'},'score',{'9,5','9.3','9.7','9.4'});
if id=='33'
    id=1;
elseif id=='10'
    id=2;
elseif id=='48'
    id=3;
else id=='41'
    id=4;
end
output=info(id).(cat)
end

我的代码适用于指定测量和用户的时间,但如果用户不存在或未请求用户,我无法弄清楚如何编码。我没试过exist(id)我收到了错误。有没有办法让我不能存在?

1 个答案:

答案 0 :(得分:2)

Matlab的exist函数会告诉您当前的Matlab实例 已知不会告诉您是否存在特定值。

您的任务可能比您原先想象的要复杂一点,但您可以使用strcmpany混合完成任务。

首先,我们将id中的info转换为带有

的单元格数组
{info.id}

现在我们可以使用strcmp将它们与id

进行比较
strcmp(id, {info.id})

最后,我们可以使用any告诉我们{info.id}中的任何值是否等于id。所以把这一切放在一起我们得到了

>> info = struct('id',{'33','10','48','41'});
>> id = '33';
>> any(strcmp(id, {info.id}))
ans =
     1

我们也可以在id中找到{info.id}的索引,并使用find而不是{{3}取消问题中的if语句}

>> id = '10'; % Present in index 2 - Output should be 2
>> find(strcmp(id, {info.id}))
ans =
     2

要回答关于未将id传递给getcogdata的最终问题,您可以使用any

执行此操作
function output = getcogdata(cat,id)
    if (nargin < 2)
        fprintf(1, 'No id passed to getcogdata()\n');
    end
end

nargin会告诉您有多少参数传递给函数getcogdata

感谢@ nargin教我Matlab的strcmp比我假设它类似的C版要好得多!

注意:请务必阅读手册!