新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 學(xué)習(xí)LabVIEW(十二)——公式節(jié)點(diǎn)

學(xué)習(xí)LabVIEW(十二)——公式節(jié)點(diǎn)

作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏
除了MATLAB節(jié)點(diǎn),LabVIEW還提供了公式節(jié)點(diǎn)。在公式節(jié)點(diǎn)中可以用非常接近C的語(yǔ)法編寫(xiě)代碼實(shí)現(xiàn)計(jì)算。之所以說(shuō)是“非常接近C”是因?yàn)樵谝恍┘?xì)節(jié)上它和C還是有些許差別。
這次拿之前在《學(xué)習(xí)LabVIEW(八)——用循環(huán)處理數(shù)組》中給出的代碼做實(shí)驗(yàn),將最內(nèi)層的循環(huán)改用公式節(jié)點(diǎn)來(lái)實(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

還沒(méi)有習(xí)慣G語(yǔ)言的時(shí)候看到這個(gè)框圖還真是一眼難以看出運(yùn)算的表達(dá)式。對(duì)于常年使用文本形式的編程語(yǔ)言的人而言,用公式節(jié)點(diǎn)改寫(xiě)這個(gè)迭代過(guò)程的話(huà)一定會(huì)直觀很多吧。
但是一旦用起來(lái)才發(fā)現(xiàn)一個(gè)嚴(yán)重的問(wèn)題:公式節(jié)點(diǎn)不支持復(fù)數(shù)!想來(lái)也在意料之中,畢竟是基于C的語(yǔ)法,而C在C99標(biāo)準(zhǔn)之前沒(méi)有內(nèi)置的復(fù)數(shù)支持。也許對(duì)復(fù)數(shù)的支持是未來(lái)語(yǔ)言的趨勢(shì),已經(jīng)有越來(lái)越多的語(yǔ)言或是內(nèi)置,或是以庫(kù)的方式提供了對(duì)復(fù)數(shù)的支持。但不管怎么樣,我們現(xiàn)在用的公式節(jié)點(diǎn)是沒(méi)有復(fù)數(shù)支持的,如http://digital.ni.com/public.nsf/allkb/9A31DC2FF5C7C5DF86256B45007AA115所述。如果用極坐標(biāo)的方式描述復(fù)數(shù),我們就得手動(dòng)展開(kāi)復(fù)數(shù)的加法,如果用直角坐標(biāo)的形式描述,就得手動(dòng)展開(kāi)復(fù)數(shù)的乘法。想想還是用直角坐標(biāo)的形式吧。
一開(kāi)始寫(xiě)了如下的一段代碼,可是運(yùn)行怎么也不對(duì):


復(fù)數(shù)的展開(kāi)怎么看也沒(méi)有錯(cuò)誤啊。
最后在MATLAB中試著算了一下,終于發(fā)現(xiàn)出問(wèn)題的地方了:在for循環(huán)內(nèi)部,將實(shí)部的計(jì)算結(jié)果賦值給了zReal,在下一行計(jì)算zImag時(shí),用的zReal就已經(jīng)是新的zReal值了,而這里所需要的是上一次的zReal值。居然會(huì)犯這種錯(cuò)誤,難道是很多年前寫(xiě)Verilog代碼的后遺癥?
解決方法很簡(jiǎn)單,在第一行計(jì)算實(shí)部的時(shí)候,將計(jì)算結(jié)果保存在另一個(gè)變量temp中,等zImag計(jì)算完成之后,再將temp中存儲(chǔ)的值賦給zReal。修正的程序如下圖所示:


還有一點(diǎn)需要注意的就是公式節(jié)點(diǎn)似乎沒(méi)有“double”,取而代之的是“float64”。
總結(jié)一下感想,公式節(jié)點(diǎn)不支持復(fù)數(shù),Array Programming也不及MATLAB,對(duì)其描述能力有點(diǎn)失望。但因?yàn)椴挥孟馦ATLAB節(jié)點(diǎn)那樣通過(guò)ActiveX通道進(jìn)行進(jìn)程間的通信,效率應(yīng)該還是可以的。


關(guān)鍵詞: LabVIEW公式節(jié)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉