Octave:如何为现有元胞数组分配正确的维度以避免“错误:=:不一致的参数op1 为 2x2x2,op2 为 2x2x2”?

问题描述

我是 Octave 的初学者,这就是为什么我会分享一些过于明显的东西。

cell_arr = cell(2,2,2);
cell_arr(2,2) = cell(2,2);

error: =: nonconformant arguments (op1 is 2x2x2,op2 is 2x2x2)

我正在分配一个与 cell_array 维度相同的数组,但它不被接受。我应该改变什么?


这是 Please Explain Octave-Error : operator /: nonconformant arguments (op1 is 1x1,op2 is 1x10)Error: nonconformant arguments (op1 is 1x3,op2 is 1x2) 的衍生产品,它们都不处理元胞数组。

解决方法

不清楚你想做什么,但你对细胞的理解似乎有点混乱。

更糟糕的是,我认为您遇到了一个错误:https://savannah.gnu.org/bugs/?func=detailitem&item_id=59637

我不想太技术化而让您更加困惑,但这里发生的事情就是这样。我们通常通过讲这个小故事来介绍元胞数组:

"有两种数组:普通数组和元胞数组。普通数组总是需要'矩形',并且包含相同类型的元素。另一方面,元胞数组可以包含不同类型的元素。 "

然而,这并不完全正确。这是一种简化。实际上,“细胞”只是一种特殊的对象;如果你喜欢,一个容器。那么一个元胞数组就是一个普通的数组,它的元素都是“元胞对象”。实际上,cell command 只是一种创建空单元格数组的快捷方式,仅此而已。

更一般地,元胞数组使用 {} 进行索引,这会打开元胞对象,并为您提供内容

然而,由于它们也可以被认为是“单元格对象”的普通数组,你也可以像普通数组一样用 () 索引它,并返回“单元格对象”本身(而不是它的内容).

例如

a = cell(1,2)   # this is equivalent to a = { [],[] }
a{1}   # returns an empty numerical array,which is what the first cell contains.
a(1)   # returns a cell object,which happens to contain an empty numerical array.

关于您遇到的错误,当涉及多维元胞数组时,octave 似乎报告了您尝试访问的元素的大小错误。这已被报道。你应该得到的是类似于

Error: op1 is 1x1,op2 is 2x2x2

换句话说:“您正试图将一个 2x2x2 数组(其元素恰好是单元格对象)塞入一个仅适合单个元素(即位置 2,2,2)的空间中。”

,

错误的原因是新的元胞数组只有在维度完全相同的情况下才能分配给现有的元胞数组。

cell_arr = cell(2,2);
x = cell(2,2);
cell_arr(2,2) = x;

最后一行导致错误,因为 cell_arr(2,2) 只选择每个维度的第二项,而不是每个维度的 2 个项。相反,只有 cell(2,2) 的初始化会为每个维度构建一个包含 2 个项目的元胞数组。

因此,重要的是您站在哪一边,以及您是启动还是重复使用单元阵列。

以下工作:

cell_arr(:,:,:) = x;
cell_arr(1:2,1:2,1:2) = x;
cell_arr(1:end,1:end,1:end) = x;
cell_arr(:,:) = x(1:2,1:2);
cell_arr(:,:) = x(:,:);
cell_arr(:,:) = x(1:end,1:end);

当然,也可以赋值直接初始化的元胞数组:

cell_arr(:,:) = cell(1:2,1:2);

这不适用于“end”,因为它在那之前不存在:

cell_arr(1:end,1:end) = cell(1:end,1:end);

错误:'end' 的无效使用:只能用于索引现有值

因此解决方案如下,如果你想给cell_arr(2,2)赋值:

右图:创建了两个 2x2x2 的元胞数组。

cell_arr = cell(2,2);

然后:

左:仅选择每个暗淡的第 2 个项目 = 1x1。右:因此,每个dim只能选择一个项目,例如第一个项目如下:

cell_arr(2,2) = x(1,1,1);