MATLAB如果函数带&,Matrix尺寸必须同意错误

时间:2017-03-05 01:49:00

标签: matlab if-statement

当我输入

时,我的代码可以正常工作
if size(k)==size(k1) 
    disp('They match');
end

if k-k1==0
    disp('They match');
end

但如果我同时输入两个条件,

if size(k)==size(k1) & k-k1==0
    disp('They match');
end

我收到错误说

  

矩阵尺寸必须达成一致。

     

练习错误(第32行)如果尺寸(k)==尺寸(k1)& K-K1 == 0

仅供参考,kk1的维度均为1x717加倍。我查了一下。

所以我想制作一个同时包含两个条件的if语句,但我遇到了错误。两个&&将无效,因为两个&&用于标量,但我的kk1是向量。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

比较两个向量时,结果也是向量(逻辑向量),但if条件接受标量逻辑值,因此可以使用all函数。

if all(size(k)-size(k1)==0) && all(k-k1==0)
    disp('They match');
end

您应始终在循环中使用&&,'&'仅用于逻辑运算AND。

我测试了这个并且它有效:

k = rand(1,10);
k1 = k;

if all(size(k)-size(k1)==0) && all(k-k1==0)
    disp('They match');
end

因为当你这样做时:

>> k-k1==0

ans =

  1×10 logical array

   1   1   1   1   1   1   1   1   1   1

因此if不知道要引用哪个值。但是当你做的时候

>> all(k-k1==0)

ans =

  logical

   1

它为矢量的所有元素提供了唯一的答案。

重要提示:

由于Floating Point Error problem,比较数字对于循环决策并不是一个好主意。

更好的战争来处理它

如果您阅读有关浮点错误的问题,您会看到有时, 2.000 == 2.000结果为false。为了解决这个问题,您可以执行以下操作:

tolerance = 0.0001;
if all(size(k)-size(k1)==0) && all(abs(k-k1)<=tolerance)
    disp('They match');
end 

首先根据您尝试解决的问题的性质定义可接受的容差值,然后将抽象的绝对值与容差进行比较,而不是将减法值与零进行比较。因此,23.000123.000等数字将被视为相等。

答案 1 :(得分:0)

问题是size(k)size(k1)返回1 * 2个向量(行数和列数),因此size(k)==size(k1)返回两个值。另一方面,k-k1==0仅返回与k&amp;具有相同维度的逻辑矩阵。 K1。

例如,如果k == k1,您会期望两者相等。

size(k)==size(k1) % returns 1 1
k == k1  % returns 1

if [1 1] && 1 % gives erros

或者,使用isequal即使尺寸不匹配也不会出错。

isequal(k,k1) % returns 1 if equal, 0 otherwise.