【问题标题】:Why does Octave print "dimensions mismatch" whereas MATLAB does not?为什么 Octave 打印“尺寸不匹配”而 MATLAB 不打印?
【发布时间】:2017-01-24 09:06:28
【问题描述】:

我正在尝试在 Octave 中运行 MATLAB 代码,但遇到以下问题:

I 是一个空矩阵,维度为 0x4,

a = 2;

属于for循环的命令是:

I = [I a];

MATLAB 输出:I = 2

八度输出:“水平尺寸不匹配(0x4 vs 1x1)”

我找到了解决此错误的方法,但我也想了解:为什么 MATLAB 接受这些不同的维度,而 Octave 会打印错误? 关于空矩阵和扩展它们有不同的定义吗? (特别是因为它不是一个“正常”的空矩阵,而是一个 0x4 的空矩阵?)

【问题讨论】:

  • 那是程序员做的? MATLAB: 将一个空矩阵连接到一个向量对结果向量没有影响。在这种情况下,空矩阵将被忽略:。 Octave,我找不到类似的文章。
  • @Jeon“那是因为程序员这样做了”和“我找不到类似的文章”根本没有提供任何信息来说明为什么 MATLAB 和 Octave 之间的行为不同。谁对此投了反对票:愿意解释为什么这个问题没有显示任何研究成果、不清楚或没有用吗?

标签: matlab matrix octave dimensions


【解决方案1】:

Matlab 发出警告,提醒您这将在未来版本中成为错误:

>> I = magic(4);
>> I(1:4,:) = []
I =
   Empty matrix: 0-by-4
>> [I 2]
Warning: This concatenation operation includes an empty array with an incorrect number of rows.
Concatenation including empty arrays will require all arrays to have the same number of rows in a future release. 

ans =
 2

Octave 上的相同代码:

>> I = magic(4);
>> I(1:4,:)=[]
I = [](0x4)

>> [I 2]
error: horizontal dimensions mismatch (0x4 vs 1x1)

所以本质上这是同一个问题,除了 Matlab 允许它暂时发出警告,并且在此处实际存在错误的维度方面提供了更多信息,而 octave 对此更为严格,希望您能弄清楚是什么这意味着?。但本质上行为是相同的。

这也是非常合理的行为,因为尝试连接两个不同大小/维度的矩阵更有可能来自错误而不是预期的行为,即使其中一个数组在此过程中变为空,所以 matlab在这里走八度音程是明智的(可以这么说)。


PS。请注意,在这种情况下,[I;2 2 2 2] 之类的代码在两个解释器上都是完全有效且正确的代码:即,您将 vertically 一个 4 列矩阵与一行连接到一个 4 列矩阵,没有行,因此列数是一致的。

【讨论】:

  • 您在使用 R2016b 吗?我在 R2016a 中没有收到警告。
  • 不可否认,我在 2013b。虽然 matlab 不跟进这样的“被弃用”警告会很奇怪......即使在终端中,你也没有得到上述代码的任何信息?
  • 我也在 R2016a,没有收到警告
  • 我发现警告在R2016a中仍然存在,just not for the exact case used in your post
  • 嗯,这很有趣,也许 Mathworks 现在将其视为特例?我想知道为什么......(可能有很多会破坏的老旧代码?)
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2014-12-14
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多