如何检查单元格的元素是否包含矩阵

时间:2017-01-16 12:50:28

标签: matlab

我有一个描述如下的单元格:

  mixed_values = {'jim', 89, [5 2 1; 1 2 3]};
  mixed_values{1}    
  mixed_values{2}
  mixed_values{3} 

我循环它:

for k=1:length(mixed_values)
  curstate=mixed_values{k};

% Check for the [5 2 1; 1 2 3]
if ismatrix(curstate)
    disp('yes');

else
   disp('no') 
end  
end

但它多次发现矩阵。

yes
yes
yes

如何顺便检查一下?

2 个答案:

答案 0 :(得分:1)

来自Matlab帮助:

  如果SIZE(M)返回[m n],则

ismatrix(M)返回逻辑1(真)   非负整数值m和n,否则为逻辑0(假)

所以我检查了size(curstate)

1 3 % 3 character string array
1 1 % of course you can do size of a single elements
2 3

所以我修改了你的代码

for k=1:length(mixed_values)
  curstate=mixed_values{k};

    % Check for the [5 2 1; 1 2 3]
    if (size(curstate,1)) > 1 && (size(curstate,2)) > 1 
        disp('yes');
        disp(size(curstate));

    else
       disp('no') 
    end  
end

答案 1 :(得分:1)

这实际上取决于你定义矩阵的内容。在MathWorks案例中,他们认为矩阵的大小是有效的,这当然是正确的。请注意,即使是标量也是矩阵,大小为1x1。你甚至可以有一个字符矩阵。 A = ['a' 'b';'c' 'd'];。我认为,在您的情况下,您希望矩阵成为至少2维的数字集合。我会这样解决:

function result = TestForMatrix(m)
    t1 = isnumeric(m);
    t2 = ~isvector(m);
    result = all([t1 t2]);
end

将其用作ismatrix

if (TestForMatrix(curstate))
    disp('yes');
else
    ....

这种方法的工作方式是测试数字将消除字符串。第二个测试将消除向量和标量。当您发现要包含或消除的更多内容时,请添加这些测试。例如,假设你想允许细胞。 t3 = iscell(m); result = all([t1 t2 t3]);可以在Matlab对象上进行许多逻辑测试,请参阅Matlab is*