如何在 MATLAB 中创建动态数组

How to create a dynamic array in MATLAB

这个数组的描述:

示例:

如果(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).


我尝试使用元胞数组,我 "kind of" 得到了一个,这是我的代码。

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

所以现在 A 是:

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

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

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

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

那么长度还是一样,A(1)A(8)不为空!

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

你应该看看 matlab 的 map https://www.mathworks.com/help/matlab/ref/containers.map.html

针对您的问题:

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

您需要创建一个元胞数组。

使用 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];

在 MATLAB 中,我们经常将多个坐标存储到一个数组中,这样 p(3,:) 就是第 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 方法效率更高,所以我总是推荐在所有情况下使用该方法。