“ABC”——“一个”被认为是有害的

3视图(30天)
每•艾萨克森
每•艾萨克森 2012年5月5日
诀窍 “ABC”——“一个” 良好的编程风格吗?
推荐- - - - - -编辑- - - - - -
“标签:goto” 暗指 Edsger Dijkstra的 著名的信;-)
标签:回答“ 是一个跟踪我提交问题的原因。我看到问题的“新Matlab”,得到的答案包括不太明显的代码与“ABC”——“一个”“嵌入式是没有理由的。
3评论
每•艾萨克森
每•艾萨克森 2012年5月10日
@Walter,隐藏的信息,老师是有原因的。

登录置评。

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2012年5月5日
加上或者减去“0”是最有效的十进编码的二进制和character-coded二进制之间的转换方法。
减去“一”或“A”(然后添加10)是一个众所周知的和有效的从character-encoded十六进制转换到二进制。
加上或者减去“(空间)是经常使用base64编码/解码(例如,MIME)[虽然代价你需要处理二进制0编码为时间而不是空间)
加上或者减去32 非常 常见的魔术高层之间的转换和小写ASCII。如此普遍,它变成了一个问题在处理EBCDIC然后iso - 8896 - *和UNICODE。如此常见,这个错误是很难找到,因为程序员阅读32, 知道 大写或小写转换,然后困惑,信件没有被正确转换……
字符' 1 '通过' 9 '一直以来连续编码位置ITA2代码1930。任何项目,不需要使用Baudot或穆雷以上代码可能会假定一个事实。任何程序编写的ASCII / ANSI / ISO / UNICODE行可能假设大写“拉丁”(英语)连续字符,并且连续小写“拉丁”(英语)字符:这是一个基本的标准化没有比假设所有MATLAB操作符的字符出现在字符集。尽我所知,MATLAB从来没有支持任何EBCDIC-based系统的假设是不正确的。万博1manbetx
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2018年6月9日
几周前,我在帮助别人为哈佛在线课程学习C语言。早期的一些练习涉及密码(如压缩空气蓄能密码),后来涉及翻译的音符字母(注意和八度)频率。
结果是令人惊讶的是很难让人 保留 计算相对位置的想法减去第一个成员的一个有序序列。
另一方面,这将是很难教初学者的想法索引mostly-unpopulated矩阵的一个角色。是荒谬的让他们单独测试平等与每个字母符号。触手可及的人是唯一现实的实现减去基本性格,或循环比较的参考向量特征提取匹配的索引。
现在他们 保留的想法找到相对位置,这是一个有效的通用技术在很多情况下他们在未来可以应用编程;连续循环比较与可能性,不是,我想说,比减去更“干净”的基础。
很多编程是关于寻找模式的任务 迎刃而解

登录置评。

更多的答案(4)

每•艾萨克森
每•艾萨克森 2012年8月13日
编辑:每•艾萨克森 2016年7月18日
显式地转换为数字之前做运算速度更快。(真正的原因:我发现“abc”——“a”混淆。)
试一试
> > [t1, t2] = cssm (1 e5)
n1 = = n2真正的
t1 =
0.3252
t2 =
0.0838
> >
在哪里
函数(t1, t2) = cssm (N)
str = char (49:120);
id1 =抽搐;
2 = 1:N
n1 = str -“一个”;
结束
t1 = toc (id1);
id2 =抽搐;
2 = 1:N
n2 =双(str) -双(“一个”);
结束
t2 = toc (id2);
如果所有(n1 = = n2)
disp (“n1 = = n2是真的”)
其他的
disp (“n1 = = n2是假的”)
结束
结束
今天早上
2016-07-18,与R2016a重新运行测试。 第一次运行完成R2011a(?)和老香草桌面。
> > [t1, t2] = cssm (1 e5)
n1 = = n2真正的
t1 =
0.0327
t2 =
0.0214
> >
新的“jit引擎”似乎更有效。和使用的效果 更小。
今天早上
测试是一个棘手的问题!在相反Jammes Tursa我看到一些利用双()在命令行。
> > S = char (“一个”+地板(兰德(1,1 e7) * 25));
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.137705秒。
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.125812秒。
> >
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.082686秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.081962秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.078693秒。
1评论
詹姆斯Tursa
詹姆斯Tursa 2016年7月17日
编辑:詹姆斯Tursa 2016年7月17日
有趣的结果。这似乎是解析器的工作优化的东西。例如,从命令行:
> > S = char (“一个”+地板(兰德(1,1 e7) * 25));
> >
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.068686秒。
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.068900秒。
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.064843秒。
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.059291秒。
> >明确;抽搐;一个= S -' 0 ';toc
运行时间是0.070644秒。
> >
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.075243秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.067354秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.077742秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.073420秒。
> >明确;抽搐;一个=双(S) -双(' 0 ');toc
运行时间是0.078540秒。
所以在命令行双()的优势就消失了。也许有一些MATLAB编译后的代码是使用在双()的情况下,解析器可用,并没有这样的编译后的代码字符-案例。
因为这个结果似乎的结果优化代码解析器能够使用,我不会感到惊讶,如果这个结果MATLAB版本之间的变化不少。
例如,一个简单的墨西哥人常规结果表明,原始的S - ' 0 '计算可以显著提高使用编译后的代码:
> >明确;抽搐;一个= char_minus(年代,' 0 ');toc
运行时间是0.044921秒。
> >明确;抽搐;一个= char_minus(年代,' 0 ');toc
运行时间是0.043699秒。
> >明确;抽搐;一个= char_minus(年代,' 0 ');toc
运行时间是0.046204秒。
> >明确;抽搐;一个= char_minus(年代,' 0 ');toc
运行时间是0.051441秒。
> >明确;抽搐;一个= char_minus(年代,' 0 ');toc
运行时间是0.058610秒。
墨西哥人的例程(梗概,而不是生产质量):
#包括“mex.h”
无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
{
mwSize我,n;
mwSize *变暗;
mwSize ndim;
mxChar * cp;
mxChar c;
双*公关;
n = mxGetNumberOfElements (prhs [0]);
dim = mxGetDimensions (prhs [0]);
ndim = mxGetNumberOfDimensions (prhs [0]);
cp = mxGetChars (prhs [0]);
c = * mxGetChars (prhs [1]);
plhs [0] = mxCreateNumericArray (ndim,弄暗,mxDOUBLE_CLASS mxREAL);
公关= mxGetPr (plhs [0]);
(n)) {
*公关+ + = * cp + + - c;
}
}

登录置评。


1月
1月 2012年5月5日
视情况而定。结果是清晰和明确,但不明显。如果你将大数组存储在一个m文件, 字符 占用更少内存的内存比 数组。但在M-files存储大型数据集是一个糟糕的编程风格,因为这种混合数据和程序。
我使用 “abc”——“一个” 只在M-files对图标进行编码,因为它允许一个模糊的结果。
颜色= [“CCCCCHFFHCCCCC”;
“CDFNBFFFFFFFDC”;
“DPGGGGGGGGGGBH”;
“DPDMMMMOOAADPD”;
“DFFFNFFFFFFFIH”;
“CILLKJGEKNGEIC”;
“CILBKJLGKFNKIC”;
“CILBKJLGKFIKIC”;
“CILBKJLGKFIKIC”;
“CDLBKJLGKFIKDC”;
“CDLBKJLGKFIKDC”;
“CDLBKJLGKFIKDC”;
“CDLBKJLGKFNKDC”;
“CDLLKJGEKNGEDC”;
“CHBGEEEGGLPNHC”;
“CMDDIIDDDDDHMC”)- (“一个”- 1);
地图=[28日26日36;
116、118、132;
南南,南;
73、74、89;
177、176、193;
96、98、112;
151、152、167;
60、63、76;
84、84、96;
220、222、236;
191、193、206;
135、133、143;
39,41岁,55岁;
108、107、118;
36岁,34岁44;
124、126、140);
大小(x, y) =(颜色);
图标=重塑(地图(颜色:)/ 255 x, y, 3);
uicontrol (“位置”,(10、10,32岁,32),CData的图标);
在我看来,这是最好的方法来存储一个图标的m文件。但是图标可以存储和编辑图形文件中舒服多了。
6个评论
1月
1月 2012年5月10日
顺便说一句。,“……”不仅不间断的,但也开始评论。不需要额外的%,甚至这是记录。

登录置评。


丹尼尔Shub
丹尼尔Shub 2012年5月5日
我相信,编码风格,牺牲readibility效率一般坏的风格。可能在某些情况下的增益效率可以抵消损失可读性。例如,在MATLAB循环曾经是那么慢,我们必须牺牲可读性vectorizing性能的所有时间的一切。值得庆幸的是,并非如此了。

丹尼尔Shub
丹尼尔Shub 2012年5月9日
我问了一个类似的问题,虽然不是相同的,一段时间:

类别

找到更多的在历史竞赛帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!