gpt4 book ai didi

arrays - 什么时候用数组,什么时候用元胞数组?

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:43 27 4
gpt4 key购买 nike

在 Matlab 中,我试图将匿名函数放入数组中:

>> a=[@(k)0.1/(k+1)    @(k)0.1/(k+1)^0.501]
??? Error using ==> horzcat
Nonscalar arrays of function handles are not allowed; use cell arrays
instead.

所以我想知道数组和元胞数组中允许使用哪些类型的元素?

比如我知道在一个数组中,元素可以是数字也可以是字符串。还有什么?

最佳答案

简而言之:元胞数组是一个异构容器,常规数组是同质。这意味着在常规数组中,所有元素都属于同一类型,而在元胞数组中,它们可以不同。您可以阅读有关元胞数组的更多信息 here .

在以下情况下使用元胞数组:

  • 你的数组中有不同的类型
  • 您不确定将来是否可以将其扩展到其他类型
  • 您正在使用具有继承模式的对象
  • 您正在处理一个字符串数组 - 几乎在任何情况下都比 char(n,m)
  • 更可取
  • 你有一个大数组,你经常更新函数中的单个元素 - 由于 Matlabs copy-on-write 策略
  • 您正在使用函数句柄(如@Pursuit 所述)

在以下情况下更喜欢常规数组:

  • 所有元素都具有相同的类型
  • 您一次性更新整个数组 - 就像数学运算一样。
  • 你想要类型安全
  • 你以后不会改变数组的数据类型
  • 您正在使用数学矩阵。
  • 您正在使用没有继承的对象

关于写时复制的更多解释:

当您将数组传递给函数时,传递的是指针/引用。

function foo(x)
disp(x);
end

x= [1 2 3 4 5];
foo(x); %No copy is done here! A pointer is passed.

但是当您更改它(或其中的一部分)时,会创建一个副本。

function foo(x)
x(4) = x(4) + 1;
end

x= [1 2 3 4 5];
foo(x); %x is being copied! At least twice memory amount is needed.

在元胞数组中,只有元胞被复制。

function foo(x)
x{4} = x{4} + 1;
end

x= {1 2 3 4 5}; %Only x{4} will be copied

因此,如果您调用一个函数来更改大型数组中的单个元素,您将进行大量复制 - 这会使速度变慢。但在元胞数组中,情况并非如此。

关于arrays - 什么时候用数组,什么时候用元胞数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com