【问题标题】:How to compare two matrices?如何比较两个矩阵?
【发布时间】:2016-08-22 16:46:10
【问题描述】:

我的目标是在两个不同的文件中比较两个矩阵:AB

 function [Result]=test()
     A_Mat= load('fileA', 'A')
     B_Mat= load('fileB', 'B')
     Result= A_Mat == B_Mat
  end

我想要的结果是一个包含AB 之间差异的矩阵。

我的错误是:

error: binary operator '==' not implemented for 'scalar struct' by 'scalar struct' operations 

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    load function doesn't return what you think it returns. 阅读广泛且易于理解的 MATLAB 文档总是有帮助的。

    function Result=test()
      load('fileA', 'A');
      load('fileB', 'B');
      Result = A == B
    end
    

    【讨论】:

    • load 的好评。但是,== 运算符不检查矩阵是否相等。它检查每个元素是否与另一个矩阵中的相应元素相同。根据 OP 的评论,我认为这就是他正在寻找的。​​span>
    • 我建议反对load-ing 使用这种方法,因为这样 lint 无法判断变量“突然进入工作区”的位置。我的建议是A = load('fileA'); A=A.A; - 这有点奇怪,但从长远来看有助于避免问题。
    • @Dev-iL 这种语法太可怕了。这如何帮助避免问题?
    • 很高兴你问到!这实际上是我在一次讲座中听到 Loren Shure 所说的话。 mlint 通常会在您尝试在定义之前使用变量时向您发出警告(只需尝试在编辑器中编写此代码:function test(), load('fileA', 'A'); A = A + A; end。想象一下您的工作区中有A,并且在某些时候您决定加载一些文件那恰好有一个A变量。然后你的A会突然改变,你不会知道它是怎么发生的。在尝试调试它时,你会查看A的所有分配但在那里找不到。你发现问题了吗?
    • @Dev-iL 她显然比我更有资格就 MATLAB 编码风格提出建议。尽管如此,我还是看不到重点。我绝对建议不要从 MAT 文件 (load('file')) 加载所有变量,因为您可能会不小心弄乱您的工作区,但我看不出加载显式命名的变量是个问题。此外,代码分析器警告充其量是不可靠的。试试function test(), load('fileA', 'A'); B = A + A; end
    【解决方案2】:

    使用isequal 函数。

    isequal(A,B)
    

    【讨论】:

    • 我试过了,它给了我,结果 = 0,但我的结果必须是一个矩阵
    • @Guillaume 确实有效。 Result 是一个布尔值,当两个矩阵相等时为1true,当它们不相等时为0false
    • 问题是 OP 向load 提供了一个返回变量,它将所有加载的变量放入一个结构数组中。这不是 OP 打算做的。
    【解决方案3】:

    如果您只是想知道AB 之间的区别,您应该首先使用load 作为dasdingonesin 的建议,并使用isequal 或使用== 检查是否完全矩阵相等。当然,区别只是由- 给出:

    isequal(A,B); % returns a boolean for full matrix equality
    A==B;         % returns a logical matrix with element wise equality
    A-B;          % returns a matrix with differences between the two matrices
    

    请注意isequal 可以处理大小不等的矩阵(它只会返回0),而==- 都会因错误Matrix dimensions must agree 而崩溃。

    【讨论】:

      【解决方案4】:

      首先,运算符== 确实适用于矩阵,它返回一个真/假 (1/0) 的逻辑矩阵,其中对应的项目分别相等或不同。从您得到的错误来看,您似乎没有从文件中读取矩阵,而是结构,实际上,== 不适用于结构。

      您可以将isequal 用于结构和矩阵。此函数仅返回一个值 - 1 或 0(真/假)。

      添加

      在看到@dasdingonesin 的回答后,他实际上指出了确切的问题,我只是想在你写的时候补充一下

      A_Mat= load('fileA', 'A')
      

      它返回一个与字段A 一样的结构。

      所以:

      A_Mat = s.A
      

      【讨论】:

      • 没问题,没关系。
      猜你喜欢
      • 2015-08-09
      • 2010-10-30
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多