在什么情况下我们需要使用“空”方法?“空”方法有什么好处?

What situations do we need to use the `empty` method? What benefits does the `empty` method provide?

提问人:bokabokaboka 提问时间:8/25/2023 最后编辑:bokabokaboka 更新时间:8/28/2023 访问量:58

问:

方法 empty 创建一个空数组。我们需要在什么情况下使用该方法?该方法有什么好处?它是否会通过预分配提高效率?它们对用户有不同的影响吗?emptyempty

输入:

A = ColorInRGB.empty(1,0);
B = ColorInRGB1();

A是 1x0 , .
是 1x1 , .
ColorInRGBmemorysize=0BColorInRGBmemorysize=0workspace

和 和有什么不一样?空的 1x0 和空的 1x1 有什么区别?或者 5x0 和 1x1 空之间有什么区别吗?如果没有区别,我们为什么要使用这种方法?ABempty

ColorInRGB.m

classdef ColorInRGB
   properties
      Color (1,3) = [1,0,0];
   end
   methods
      function obj = ColorInRGB(c)
         if nargin > 0
            obj.Color = c;
         end
      end
   end
end

ColorInRGB1.m

classdef ColorInRGB1
    properties
        Color; % (1,3) = [1,0,0];
    end
    methods
%         function obj = ColorInRGB(c)
%             if nargin > 0
%                 obj.Color = c;
%             end
%         end
    end
end

2023/08/27 12:59 这两个类是不同的。我的问题是,ColorInRGB1()可以帮助我获得一个空数组,那么为什么我们仍然需要一个“空方法”呢?一旦我知道了它们之间的区别,我就可以理解何时在什么场景中使用 ColorInRGB1() 以及何时使用 ColorInRGB.empty(1,0);在其他方面。

MATLAB OOP 方法 empty-list

评论

0赞 Wolfie 8/25/2023
您声明的输出是错误的,这使得这看起来比实际更令人困惑。 返回一个 ,即它的大小不正确,而不是你所说的。当您有多个变量时,这很有用,这些变量的大小应该具有一定的一致性,因此您可以在它们之间进行操作或具有更多的验证/更健壮的预期行为,例如在非零维度上循环。同样来自文档 此方法对于创建数据类型的空数组很有用,这些数据类型没有用于创建空数组的特殊语法,例如双精度数组的 []。ColorInRGB.empty(0,5)0x5 ColorInRGB array1x0
0赞 bokabokaboka 8/25/2023
@Wolfie对不起,那是我的错误。代码应为 A = ColorInRGB.empty(1,0) 而不是 A = ColorInRGB.empty(0,5)。感谢您指出错误,我已经更新了问题。
0赞 Cris Luengo 8/25/2023
和 之间最大的区别是它们属于不同的类别。这让问题有点混乱。除此之外,是真的,而是假的。ABisempty(A)isempty(B)
0赞 bokabokaboka 8/27/2023
@CrisLuengo 这两个类确实是不同的。我的问题是,可以帮助我获得一个空数组,那么为什么我们仍然需要一个方法呢?当然,您提到“isempty(A) is true”是一个显着的区别。但我也想知道是否还有其他区别。一旦我知道了它们之间的区别,我就可以了解何时在什么场景中使用,何时在其他场景中使用。ColorInRGB1()emptyColorInRGB1()ColorInRGB.empty(1,0);
0赞 bokabokaboka 8/27/2023
@CrisLuengo 谢谢你的帮助。memorysize 是工作区的一列,显示它占用的内存。例如,x=['abad''1235''asdf'] 占用的空间为 1x14。我用的是matlab的中文版,不知道英文版这个专栏叫什么名字?

答:

0赞 Cris Luengo 8/27/2023 #1

B是一个 1x1 对象数组,其唯一字段是空数组。 是一个 1x0 对象,它没有元素。A

B不是空数组,而是包含空数组。 是一个空数组。A

我理解为什么区别不明显。两者都不包含任何数据(这是工作区资源管理器和命令报告的“内存大小”,其中不包括对象本身的开销)。但也有明显的区别:whos

  • 该测试对 为 true,但对 不适用。isemptyAB
  • 我们可以索引为 : is valid, is not。 是有效的,转让也是有效的;你不能用 .BB(1)A(1)B.ColorB.Color = 'foo'A

这与空元胞数组和 1x1 元胞数组之间的区别完全相同,后者包含空数组。{}{[]}


如果你想知道为什么可以创建一个 1x0 数组,而不是只有一个0x0数组,以及为什么我们想要空数组,请参阅这个问题和另一个问题empty