【发布时间】:2012-10-22 09:12:38
【问题描述】:
我想问是否有实现一个程序,可以生成带有点分隔符“。”的 ID。比如:
a1.b2.c3
请注意,我不想将点作为字符处理,它应该像分隔符一样。
如果你在你的名字和你父亲的名字和你祖父的名字之间加上一个点,就像:
John.Paul.Hit
【问题讨论】:
-
“生成 ID”是什么意思?你只是说字符串吗?
标签: matlab
我想问是否有实现一个程序,可以生成带有点分隔符“。”的 ID。比如:
a1.b2.c3
请注意,我不想将点作为字符处理,它应该像分隔符一样。
如果你在你的名字和你父亲的名字和你祖父的名字之间加上一个点,就像:
John.Paul.Hit
【问题讨论】:
标签: matlab
正如所指出的,您已经可以这样做了。但是,您应该认识到它的效率会降低
A = 3;
B.C.D.E = 3;
whos A B
Name Size Bytes Class Attributes
A 1x1 8 double
B 1x1 536 struct
看到 B 占用的存储空间比 A 多。
另外,您需要认识到 A.B 和 A.C 在 MATLAB 中不是不同的对象,而是同一个结构 A 的一部分。事实上,如果我现在尝试创建 A.B,它会感到不安,因为 A 已经存在于双重的。
A.B = 4
Warning: Struct field assignment overwrites a value with class "double". See MATLAB R14SP2 Release Notes, Assigning Nonstructure Variables As Structures
Displays Warning, for details.
A =
B: 4
原来的变量A已经不存在了。
还有时间问题。该结构的效率会降低。
timeit(@() A+2)
Warning: The measured time for F may be inaccurate because it is close to the estimated time-measurement overhead (3.8e-07 seconds). Try measuring
something that takes longer.
> In timeit at 132
ans =
9.821e-07
timeit(@() B.C.D+2)
ans =
3.6342e-05
看到将 2 加到 A 是如此之快,以至于 timeit 无法测量它。但是 B.C.D 加 2 需要大约 30 倍的时间。
所以,最后,你可以用结构做你想做的事,但有充分的理由不这样做,除非你对点有非常有效的需求。在我展示的方面,备用分隔符效果更好。
A = 3;
A_B_C_D = 3;
whos A*
Name Size Bytes Class Attributes
A 1x1 8 double
A_B_C_D 1x1 8 double
使用这些变量中的任何一个,计算速度都一样快。
【讨论】:
Matlab 已经在 ids 中使用点作为分隔符,特别是在结构及其字段的 ids 中。比如执行
a.b = 3
创建一个名为a 的结构体,其中包含一个名为b 的字段,该字段本身的值为3。阅读有关structures 主题和函数struct 的文档。
【讨论】:
不是你想要的方式。正如上面的答案所指出的,点在 ML 语法中具有特殊含义,不能用作标识符本身的一部分。
【讨论】: