如果(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
是:
然后假设我们有(2,2),并且应该将其分配给A(9)
A(9,end) = {[2,2]}
看起来不错,但是如果我们再次将(1,1)分配给A(10)
,
A(10,end) = {[1,1]}
然后长度仍然相同,并且A(1)
至A(8)
不能为空!
我的问题是,还有其他方法可以帮助我创建动态数组吗?
答案 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