MATLAB中的空对象

时间:2015-05-07 13:31:55

标签: matlab

在很多情况下,我已经看到MATLAB将返回空对象,如果你看它们的大小,它们将是1 x 0或0 x 1。 一个例子是以下代码:

img = zeros(256); % Create a square zero image of dimension 256 X 256
regions = detectMSERFeatures(img); 
size(regions)

如果你看一下区域的大小,它将是0 X 1.我的问题如下。其中一些问题可能会重叠。

  1. 这些尺寸的含义是什么?
  2. 关于这些对象的内存布局可以说什么?我询问内存布局的原因是因为MATLAB允许您编写以下语句:temp = zeros(1,0);
  3. 为什么MATLAB在这种情况下不能简单地返回一个空的常量,而不是返回大小为1 x 0的怪人?

1 个答案:

答案 0 :(得分:1)

MATLAB中的数组可以具有零大小的任何维度 - 我猜这最初可能看起来很奇怪,但它们只是像其他任何数组一样。

您可以直接创建它们:

>> a = double.empty(2,0,3,0,2)
a =
   Empty array: 2-by-0-by-3-by-0-by-2

或使用其他数组创建功能,例如zerosonesrand等。

请注意,从上面可以明显看出,空数组仍然有一个类 - 您可以使用double.emptyuint8.emptylogical.empty等创建它们。用户定义的类也是如此。

拥有这样的数组非常有用,而不仅仅是一个NULL元素。没有它们,你需要花费大量的编程工作来检查你有一个NULL而不是一个数组的边缘情况,并且你将无法区分为NULL的数组,因为它们没有行,而数组这是NULL,因为它们没有列。

此外,它们对初始化数组很有用。例如,假设你有一个数组需要从空开始但后来被填充,你知道它总是有三行但是列数可变。然后,您可以将其初始化为double.empty(3,0),并且您知道您的初始值将始终通过对阵列所具有的行数的任何检查。如果将它初始化为[](零归零)或NULL元素,则无效。

最后,您还可以使用与非空数组相同的方式将它们相乘。你可能会感到惊讶:

>> a = double.empty(2,0)
a =
   Empty matrix: 2-by-0
>> b = double.empty(0,3)
b =
   Empty matrix: 0-by-3
>> a*b
ans =
     0     0     0
     0     0     0

但是如果你认为它,它只是矩阵乘法的常规规则的逻辑和必要的应用/扩展。

关于它们如何存储在内存中 - 再次,它们就像常规MATLAB数组一样存储。我不记得确切的细节(在mxArray的文档中查看),但它基本上是一个给出维度的标题(其中一些可能为零),后面是列主要顺序的元素列表(在这种情况下是一个空列表)。