除了MATLAB節(jié)點(diǎn),LabVIEW還提供了公式節(jié)點(diǎn)。在公式節(jié)點(diǎn)中可以用非常接近C的語法編寫代碼實(shí)現(xiàn)計(jì)算。之所以說是“非常接近C”是因?yàn)樵谝恍┘?xì)節(jié)上它和C還是有些許差別。
這次拿之前在《學(xué)習(xí)LabVIEW(八)——用循環(huán)處理數(shù)組》中給出的代碼做實(shí)驗(yàn),將最內(nèi)層的循環(huán)改用公式節(jié)點(diǎn)來實(shí)現(xiàn)。之前的最內(nèi)層循環(huán)如下圖所示:
其實(shí)現(xiàn)的運(yùn)算相當(dāng)于:
z = 0
for k in range(128):
z = z * z input;
if abs(z) > 2:
break
還沒有習(xí)慣G語言的時(shí)候看到這個(gè)框圖還真是一眼難以看出運(yùn)算的表達(dá)式。對于常年使用文本形式的編程語言的人而言,用公式節(jié)點(diǎn)改寫這個(gè)迭代過程的話一定會直觀很多吧。
但是一旦用起來才發(fā)現(xiàn)一個(gè)嚴(yán)重的問題:公式節(jié)點(diǎn)不支持復(fù)數(shù)!想來也在意料之中,畢竟是基于C的語法,而C在C99標(biāo)準(zhǔn)之前沒有內(nèi)置的復(fù)數(shù)支持。也許對復(fù)數(shù)的支持是未來語言的趨勢,已經(jīng)有越來越多的語言或是內(nèi)置,或是以庫的方式提供了對復(fù)數(shù)的支持。但不管怎么樣,我們現(xiàn)在用的公式節(jié)點(diǎn)是沒有復(fù)數(shù)支持的,如http://digital.ni.com/public.nsf/allkb/9A31DC2FF5C7C5DF86256B45007AA115所述。如果用極坐標(biāo)的方式描述復(fù)數(shù),我們就得手動展開復(fù)數(shù)的加法,如果用直角坐標(biāo)的形式描述,就得手動展開復(fù)數(shù)的乘法。想想還是用直角坐標(biāo)的形式吧。
一開始寫了如下的一段代碼,可是運(yùn)行怎么也不對:
復(fù)數(shù)的展開怎么看也沒有錯(cuò)誤啊。
最后在MATLAB中試著算了一下,終于發(fā)現(xiàn)出問題的地方了:在for循環(huán)內(nèi)部,將實(shí)部的計(jì)算結(jié)果賦值給了zReal,在下一行計(jì)算zImag時(shí),用的zReal就已經(jīng)是新的zReal值了,而這里所需要的是上一次的zReal值。居然會犯這種錯(cuò)誤,難道是很多年前寫Verilog代碼的后遺癥?
解決方法很簡單,在第一行計(jì)算實(shí)部的時(shí)候,將計(jì)算結(jié)果保存在另一個(gè)變量temp中,等zImag計(jì)算完成之后,再將temp中存儲的值賦給zReal。修正的程序如下圖所示:
還有一點(diǎn)需要注意的就是公式節(jié)點(diǎn)似乎沒有“double”,取而代之的是“float64”。
總結(jié)一下感想,公式節(jié)點(diǎn)不支持復(fù)數(shù),Array Programming也不及MATLAB,對其描述能力有點(diǎn)失望。但因?yàn)椴挥孟馦ATLAB節(jié)點(diǎn)那樣通過ActiveX通道進(jìn)行進(jìn)程間的通信,效率應(yīng)該還是可以的。