我想以下列方式存储一些结果:
Res.0 = magic(4); % or Res.baseCase = magic(4);
Res.2 = magic(5); % I would prefer to use integers on all other
Res.7 = magic(6); % elements than the first.
Res.2000 = 1:3;
我想使用0到3000之间的数字,但我只会使用大约100-300的数字。是否可以使用0作为标识符,或者我必须使用最小值1? (这些数字有意义,所以我更愿意,如果我不需要改变它们)。我可以在结构中使用数字作为标识符吗?
我知道我可以做到以下几点:
Res{(last number + 1)} = magic(4);
Res{2} = magic(5);
Res{7} = magic(6);
Res{2000} = 1:3;
请记住,最后一个元素实际上是“数字零”元素。
在这种情况下,我将在非填充位置创建一堆空单元格[]
。这会导致问题吗?我假设最好先分配最后一个元素,以避免创建一个增长的单元格,或者这不会产生影响?这是一种有效的方法吗?
哪个效率最高,struct
或cell
? (如果可以使用struct
,那就是)。
我主要担心的是计算效率。
谢谢!
答案 0 :(得分:5)
让我们回顾一下您的选择:
MATLAB索引从1开始,而不是从0开始。如果要将数据存储在单元数组中,在最坏的情况下,您总是可以使用下标k + 1
来索引对应于的单元格k -th标识符( k ≥0)。在我看来,使用最后一个元素作为“基本案例”更加令人困惑。那么你将拥有的是:
Res{1} = magic(4); %// Base case
Res{2} = magic(5); %// Corresponds to identifier 1
...
Res{k + 1} = ... %// Corresponds to indentifier k
结构中的字段名称不允许以数字开头,但允许它们从第二个字符开始包含它们。因此,您可以像这样构建您的结构:
Res.c0 = magic(4); %// Base case
Res.c1 = magic(5); %// Corresponds to identifier 1
Res.c2 = magic(6); %// Corresponds to identifier 2
%// And so on...
您可以使用dynamic field referencing访问任何字段,例如:
k = 3;
kth_field = Res.(sprintf('c%d', k)); %// Access field k = 3 (i.e field 'c3')
我不能说哪种选择看起来更优雅,但我相信索引到单元格应该比动态字段引用更快(但欢迎你检查一下并证明我错了)。
答案 1 :(得分:3)
作为EitanT's answer的替代方案,听起来matlab的map containers正是您所需要的。他们可以处理任何类型的密钥,其值可能是struct
或cell
。
修改强>
在你的情况下,这将是:
k = {0,2,7,2000};
Res = {magic(4),magic(5),magic(6),1:3};
ResMap = containers.Map(k, Res)
ResMap(0)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
答案 2 :(得分:1)
我同意@wakjah评论中的想法。如果您担心程序的 效率 ,最好更改问题的解释。在我看来,肯定有一种方法可以优先排序您的数据。此优先级可以根据您获取它们的时间,也可以根据计算它们的输入进行。如果在它们中设置任何类型的优先级,则可以将它们排序到结构或单元格中(结构可能更快)。
所以
Priority (Your Current Index Meaning) Data
1 0 magic(4)
2 2 magic(5)
3 7 magic(6)
4 2000 1:3
然后:
% Initialize Result structure which is different than your Res.
Result(300).Data = 0; % 300 the maximum number of data
Result(300).idx = 0; % idx or anything that represent the meaning of your current index.
% Assigning
k = 1; % Priority index
Result(k).idx = 0; Result(k).Data = magic(4); k = k + 1;
Result(k).idx = 2; Result(k).Data = magic(5); k = k + 1;
Result(k).idx = 7; Result(k).Data = magic(6); k = k + 1;
...