yufushumo 发表于 2004-6-2 01:00:26

<P><FONT color=#ee1111>MATLAB程序语言(转载!)</FONT></P><P><TABLE width="100%" bgColor=#00ffff border=0><TR><TD width="100%"><P align=center><FONT face=隶书 size=4>MATLAB 编程技巧</FONT></P></TD></TR></TABLE></P><P>这里只介绍加快MATLAB程序编程效率的建议,其他内容请参见作者著作。</P><P>因为 MATLAB 语言是一种解释性语言,所以有时 MATLAB 程序的执行速度不是很理想。这里将依照作者十多年的实际编程经验给出加快 MATLAB 程序执行速度的一些建议和体会。</P><UL><LI>尽量避免使用循环:循环语句及循环体经常被认为是~MATLAB 编程的瓶颈问题。改进这样的状况有两种方法:
(1) 尽量用向量化的运算来代替循环操作。我们将通过如下的例子来演示如何将一般的循环结构转换成向量化的语句。
〖例3.19〗考虑下面无穷级数求和问题:
<img src="http://www.matlab-world.com/lecture_gifs/c3f00.gif">
如果我们只求出其中前有限项,比如 100,000 项之和 (要精确地求出级数的和,无需求 100000 项,几十项往往就能得出满意的精度。这里主要是为了演示循环运算向量化的优越性。),则可以采用下面的常规语句进行计算
&gt;&gt; tic, s=0;
for i=1:100000, s=s+(1/2^i+1/3^i); end, s,toc
s =
1.5000
elapsed_time =
1.9700

如果采用向量化的方法,则可以得出下面结果。可以看出,采取向量化的方法比常规循环运算效率要高得多。
&gt;&gt; tic, i=1:100000; s=sum(1./2.^i+1./3.^i), toc
s =
1.5000
elapsed_time =
0.3800

(2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。

〖例3.20〗考虑生成一个 5x10000 的 Hilbert 长方矩阵,该矩阵的定义是其第 i 行第 j 列元素为 h_{i,j}=1/(i+j-1)。我们可以由下面语句比较先进行 i=1:5 的循环和后进行该循环的耗时区别,其效果和前面分析的是一致的。
&gt;&gt; tic
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
8.6800
&gt;&gt; tic,
for j=1:10000
for i=1:5
J(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
25.7000 <LI>大型矩阵的预先定维
给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用 MATLAB 的内在函数,如zeros() 或 ones() 对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的。

再考虑例 3-20 中的问题,如果输入下面的命令
&gt;&gt; tic
H=zeros(5,10000);
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
1.0400
则采用预先定维的方法,再结合向量化的方法,我们可以给出下面的 MATLAB 语句。
&gt;&gt; tic
H=zeros(5,10000);
for i=1:5
H(i,:)=1./;
end
toc
elapsed_time =
0.060

可见,预先定维后,所需要的时间显著地减少了。可以看出,同样一个问题,由于采用了有效的措施,所需的时间就可以从 25.7 秒减少到 0.06 秒,亦即效率提高了 428 倍。 <LI>对二重循环这样的特殊问题,我们还可以使用 meshgrid() 函数构造两个 5x10000 矩阵 i 和 j,从而直接得出 H 矩阵,更进一步地加快速度。
&gt;&gt; tic, =meshgrid(1:5,1:10000); H=1./(i+j-1); toc
elapsed_time =
0 <LI>优先考虑内在函数
矩阵运算应该尽量采用 MATLAB 的内在函数,因为内在函数是由更底层的编程语言 C 构造的,其执行速度显然快于使用循环的矩阵运算。 <LI>采用有效的算法
在实际应用中,解决同样的数学问题经常有各种各样的算法。例如求解定积分的数值解法在 MATLAB
中就提供了两个函数 quad() 和 quad8(),其中后一个算法在精度、速度上都明显高于前一种方法。所以说,在科学计算领域是存在“多快好省”的途径的。如果一个方法不能满足要求,可以尝试其他的方法。 <LI>应用 Mex 技术
虽然采用了很多措施,但执行速度仍然很慢,比如说耗时的循环是不可避免的,这样就应该考虑用其他语言,如 C 或 Fortran 语言。按照 Mex 技术要求的格式编写相应部分的程序,然后通过编译联接,形成在 MATLAB 可以直接调用的动态连接库 (DLL) 文件,这样可以显著地加快运算速度。有关 Mex 技术及其应用的详细内容可参见第 7 章。 </LI></UL><P><FONT color=#ff0000>转载自Mtalab大观圆,</FONT><a href="http://www.matlab-world.com/" target="_blank" ><FONT color=#ff0000>http://www.matlab-world.com/</FONT></A><FONT color=#ff0000>原作:东北大学薛定宇</FONT></P>

在别处 发表于 2004-6-2 01:27:19

<P>   答案是否<b><FONT color=#000000>黑桃4</FONT></b></P>

anxu 发表于 2004-6-2 22:42:29

<P>好象是草花4。</P><P>因为,P一开始不知道的,Q知道</P>

移动先锋 发表于 2004-6-6 19:24:33

<P>q说知道p不知道,就可以排除黑桃和草花了</P><P>然后p又说知道了就可以排出是a得可能性</P><P>假如是红桃的话p说知道了后q还是不能知道是什么牌,所以应该是方块5了</P>

hunterivanwang 发表于 2004-6-6 20:32:42

肯定红Q

stanjihn 发表于 2004-6-7 02:33:50

答案是黑桃4

秋风 发表于 2004-6-22 23:35:48

<P>1.P先生、Q先生都具有足够的推理能力(他们不是白痴)。</P><P>2.一定注意1、2句话的关系。(非常关键)</P><P>3.P先生:"我不知道这张牌。" (这牌肯定不是J、8、2、7、3、k、6)——牌就剩如下情况:
       红桃 A、Q、4
       黑桃 4
       草花 Q、5
       方块 A、5</P><P>4.Q先生:"我知道你不知道这张牌。"请注意,Q先生并不是由于P先生的话才这么说,但也不是一点关系都没有(我也不知怎么表达才好)。Q敢如此肯定,表明教授告知的不是黑桃与草花。为什么呢?因为如果是黑桃与草花,Q先生就不敢如此肯定P先生一定不知道这张牌(在这两种花色中都有单牌!)。
    还有一点:Q也不知道是什么牌!所以可以把黑桃 4排除。
   于是只剩如下牌:
       红桃 A、Q、4
       方块 A、5</P><P>5.P先生:"现在我知道这张牌了。" --从这句话可以排除A。因为如果是A,P先生就不敢说这句话。
      于是只剩下如下牌:
       红桃 Q、4
       方块 5</P><P>Q先生:"我也知道了。" --得出结果是方块5。因为如果Q先生被告知的是红桃,他就不可能说这句话(红桃里还剩两张牌)。</P>

0078998700a 发表于 2004-6-23 06:49:10

<P>Q的话有两种理解:(1)他知道一件事,即P不知道这张牌.答案是方片5</P>
<P>                           (2)他知道牌,但Q不知道牌.答案是黑桃4</P>

sole 发表于 2004-6-24 00:39:32

<DIV class=quote><B>以下是引用<I>fei202</I>在2004-3-16 1:10:10的发言:</B>
方块5!!!

P先生:"我不知道这张牌。"==是A、4、5、Q
Q先生:"我知道你不知道这张牌。"==红桃、方块
P先生:"现在我知道这张牌了。" ==不是A
Q先生:"我也知道了。" 他怎么会知道呢,一定是他被告之的花色是方块,否则如果是红桃的话,那又到底是红桃q还是红桃4呢?他就不会说知道了。他既然说了知道了,那肯定是方块。
那就是方块5!
大家看看有没有漏洞!</DIV>我绝对赞成这个答案,写的简洁,推荐大家看这个推理过程!

zgleng 发表于 2004-6-24 03:11:43

<P>不是黑桃的理由:</P><P>假若是黑桃则q不能知道p不知道,因为若为黑桃j,显然p是知道的</P>
页: 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25
查看完整版本: 新手入门测试