何时使用数组以及何时使用单元格数组?

Tim*_*Tim 5 arrays matlab

在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.
Run Code Online (Sandbox Code Playgroud)

所以我想知道数组和单元数组中允许哪些元素?

例如,我知道在数组中,元素可以是数字或字符串.还有什么?

And*_*ein 6

简而言之:Cell数组是异构容器,规则数组是同构的.这意味着在常规数组中,所有元素都是相同类型,而在单元数组中,它们可以是不同的.你可以阅读更多关于单元阵列在这里.

使用单元格数组时:

  • 您的阵列中有不同的类型
  • 您不确定将来是否可以将其扩展到其他类型
  • 您正在使用具有继承模式的对象
  • 您正在处理一组字符串 - 几乎在任何情况下它都优于char(n,m)
  • 您有一个大型数组,并且经常更新函数中的单个元素 - 由于Matlabs 写时复制策略
  • 您正在使用函数句柄(正如@Pursuit所解释的那样)

身高规则排列时:

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

关于copy-on-write的更多解释:

将数组传递给函数时,将传递指针/引用.

function foo(x)
     disp(x);
end

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

但是当你改变它(或它的一部分)时,就会创建一个副本.

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.
Run Code Online (Sandbox Code Playgroud)

在单元阵列中,仅复制单元格.

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

x= {1 2 3 4 5}; %Only x{4} will be copied
Run Code Online (Sandbox Code Playgroud)

因此,如果您调用一个更改大型数组上的单个元素的函数,则会生成大量副本 - 这会使其变慢.但在单元阵列中,情况并非如此.