4

我想通过以下方式存储一些结果:

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's 或's哪个最有效cell?(如果可以使用struct's,那就是)。

我主要关心的是计算效率。

谢谢!

4

3 回答 3

5

让我们回顾一下您的选择:

索引到元胞数组

MATLAB 索引从 1 开始,而不是从 0 开始。如果要将数据存储在元胞数组中,在最坏的情况下,您始终可以使用下标来索引与第k个标识符 ( k ≥ 0)k + 1对应的元胞。在我看来,使用最后一个元素作为“基本情况”更令人困惑。所以你将拥有的是:

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...

您可以使用动态字段引用来访问任何字段,例如:

k = 3;
kth_field = Res.(sprintf('c%d', k)); %// Access field k = 3 (i.e field 'c3')

我不能说哪个替代方案看起来更优雅,但我相信索引到单元格应该比动态字段引用更快(但欢迎您检查并证明我错了)。

于 2013-06-03T11:11:30.150 回答
3

作为EitanT 答案的替代方案,听起来地图容器正是您所需要的。它们可以处理任何类型的键,值可能是 astructcell

编辑:

在您的情况下,这将是:

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
于 2013-06-03T11:56:25.570 回答
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;
...
于 2013-06-03T13:32:58.453 回答