如何在MATLAB中创建动态数组

时间:2018-11-18 00:53:24

标签: arrays matlab cell-array

此数组的说明:

  • 10个维度,代表10个簇。
  • 每个尺寸的长度不是固定的,一开始应为零。
  • 聚类后,一个坐标(x,y)将分配给相应的聚类。

示例:

如果(1,1)属于聚类10,(2,2)属于聚类9,并给出了一个坐标序列

(1,1) (1,1) (1,1) (1,1) (1,1) (2,2)

然后A(1)A(8)没有元素,而A(9)有1个元素的值(2,2),而A(10)有5个元素的值(1,1)


我尝试使用单元数组,但我得到了一种,这是我的代码。

A = cell(10,0) 
%create empty cell array
A(10,end+1) = {[1,1]} 
%assign (1,1) to cluster 10

所以现在A是:

A

然后假设我们有(2,2),并且应该将其分配给A(9)

A(9,end) = {[2,2]}

A9

看起来不错,但是如果我们再次将(1,1)分配给A(10)

A(10,end) = {[1,1]}

A3

然后长度仍然相同,并且A(1)A(8)不能为空!

我的问题是,还有其他方法可以帮助我创建动态数组吗?

3 个答案:

答案 0 :(得分:1)

您需要创建一个单元格数组。

使用repmat创建一个10 x 1的空单元格数组:

A = repmat({{}},10,1);

要访问嵌套的单元格,您需要链接索引:

A{10}(end+1) = {[1,1]};
A{9} (end+1) = {[2,2]};
A{10}(end+1) = {[1,1]};

或更简单的索引编制:

A{10}{end+1} = [1,1];
A{9} {end+1} = [2,2];
A{10}{end+1} = [1,1];

答案 1 :(得分:1)

在MATLAB中,我们经常将多个坐标存储到单个数组中,使得p(3,:)是第三个点。 [理由之一是,这是一种更有效的数据存储方式,因为每个阵列都有开销,并且将许多点存储为单个阵列,例如因此,单元阵列非常浪费内存。]

我建议您使用该方法在每个群集中存储坐标。例如:

A = cell(10,1); % 10 clusters, we won't change the size of A
A{10}(end+1,:) = [1,1]; 
A{9}(end+1,:) = [2,2];
A{10}(end+1,:) = [1,1];

现在我们可以看到A中的内容:

>> A{1}
ans =
     []

>> A{9}
ans =
     2     2

>> A{10}
ans =
     1     1
     1     1

请注意,A{10}是单元格的内容(在本例中为数字数组),而A(10)是具有一个单元格的单元格数组。

A{10}(1,:)是群集10中的第一个坐标。size(A{10},1)是群集10中的坐标的数量。

A{10}(end+1,:) = [1,1]是附加元素的一种方法。 end+1是不存在的位置,这意味着将扩展数组以容纳在此分配的新数据。另一种方法是A{10} = [A{10} ; 1,1]。我不确定这两种方法是否等效。对于向量或附加列,end+1方法效率更高,因此在所有情况下我都建议使用该方法。

答案 2 :(得分:0)

您可能应该看一下matlab的地图 https://www.mathworks.com/help/matlab/ref/containers.map.html

E.G。对于您的问题:

A = containers.Map('KeyType','int32','ValueType','any');
A(9) = [2 2];

A(10) = [1 1;1 1;1 1;1 1;1 1];

现在 A(9)具有一个值为(2,2)的向量,而A(10)具有10个值为(1,1)的行向量。

您可以使用与输入值相同的方式来检索值:

>> A(9)

ans =

     2     2

>> A(10)

ans =

     1     1
     1     1
     1     1
     1     1
     1     1

将向量添加到已定义的键中:

>> A(9) = [A(9); 2 2];
>> A(9)

ans =

     2     2
     2     2
相关问题