11/03/2006

黃世榮:經緯儀的定位

前言:早前出差去使用經緯儀,希望能用兩種角度去作定位
問題:如何在只有兩組經緯儀的角度下作空間點群的定位,在建立公式以及程式後,發覺程式當時剛學技巧有需要改進且似乎這樣的計算是有錯的,希望大家幫忙想
程式流程:
clear
format long
matrix=xlsread('diow.xls','sheet1','A2:L3'); %% read the data
[m,n]=size(matrix); %% get row and column
L=input('Input the L you get==> ')
%%request the distance between two measure point

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% to build the alpha's array
for i=1:m
A(i)=matrix(i,1)
%% to build the alpha's array
A2(i)=matrix(i,2)
%% to build the alpha's minute array
A3(i)=matrix(i,3)
%% to build the alpha's second array

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% to build the theta's array
S(i)=matrix(i,4)
%% to build the theta's array
S2(i)=matrix(i,5)
%% to build the theta's minute array
S3(i)=matrix(i,6)
%% to build the theta's second array

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% to build the Beta's array
B(i)=matrix(i,7)
%% to build the Beta's array
B2(i)=matrix(i,8)
%% to build the Beta's minute array
B3(i)=matrix(i,9)
%% to build the Beta's second array

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% to build the PHI's array

F(i)=matrix(i,10)
%% to build the PHI's array
F2(i)=matrix(i,11)
%% to build the PHI's minute array
F3(i)=matrix(i,12)
%% to build the PHI's second array
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% to make their unit coherence
for i=1:m
A(i)=A(i)+(A2(i)/60)+(A3(i)/3600)
S(i)=S(i)+(S2(i)/60)+(S3(i)/3600)
B(i)=B(i)+(B2(i)/60)+(B3(i)/3600)
F(i)=F(i)+(F2(i)/60)+(F3(i)/3600)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%find that limit it or not is no matter
for i=1:m
% if B(i)<90
C(i,1)=L*sin(B(i)/180*pi)/sin((B(i)-A(i))/180*pi)
% to build X's array (X,Y are not the real coordinate)
C(i,2)=L*sin(A(i)/180*pi)/sin((B(i)-A(i))/180*pi)
% to build Y's array
% end
% if B(i)>90
% C(i,1)=L*sin(B(i)/180*pi)/sin((B(i)+A(i))/180*pi)
% to build X's array
% C(i,2)=L*sin(A(i)/180*pi)/sin((B(i)+A(i))/180*pi)
% to build Y's array
% end
end


%% to build coordinates' matrix
for i=1:m
H(i,1)=C(i,1)*sin(A(i)/180*pi)
H(i,2)=C(i,1)*cos(A(i)/180*pi)
H(i,3)=C(i,1)*tan(S(i)/180*pi)
H(i,4)=C(i,2)*sin(B(i)/180*pi)
H(i,5)=C(i,2)*cos(B(i)/180*pi)+L
H(i,6)=C(i,2)*tan(F(i)/180*pi)
end


%output the data to excel
xlswrite('test',H,'sheet1','A2');

for i=1:m
plot3(H(i,1),H(i,2),H(i,3),'o');
plot3(H(i,4),H(i,5),H(i,6),'o');
hold on
end

吳子青: 試作搜尋引擎( I )

前言:
本來構想是希望作一個可以將老師部落格上面
關於Matlab程式碼斷行問題解決的程式

利用copy指令將部落格的程式碼複製下來
會發現變成一整行 老師在上課的時候也不太方便
構想:
因為學到cell() 本來希望將整個文件按照字元存成
cell, 再去對矩陣作處理, 把斷行點找出來之後
重新輸出成正確的文件
但是...
找不到可以斷行的依據

所以轉換方向作一個網頁或是文件的搜尋器 (google..??)
目前進度緩慢,所以分階段進行

問題
如何將字元讀出並進行搜尋動作?

----------------------------------------------------------
答案:
題旨與分析
將文件讀入 並將文件裡面的每個字元存入記憶體宣告成矩陣
(或者文件太大以動態搜尋方式不先將整個文件全部存入記憶體)
對矩陣作搜尋動作, 找出關鍵字 對應的位置
將搜尋到的字元或位置進行後置處理
(列出一整行,或者標示不同顏色?)
作出使用者介面

程式流程
因為尚未完成所以先簡述如下

/tra.m/
[fid,message]=fopen('test2.txt','r');
mydata=fread(fid);
if fid==-1
disp(message);
end
fclose all;

%如此就將文件文字全部以二進位儲存方式
%儲存成矩陣mydata

/dis.m/
disp(char(mydata'))

/run.m/
[m,n]=find(mydata==keyword);
%找出矩陣中的keyword的二進位元,在mydata中作搜尋
找出對應的位置
A={mydata(m,n-2) mydata(m,n-1) mydata(m,n) mydata(m,n+1) mydata(m,n+2) };
disp(char(A));
%將關鍵字元的二進位碼轉換, 並顯示前兩字後兩字

執行結果
test2.txt 內容 ghuodjgpobinhindpohinjestpohdbvuisneptogindbuodb
關鍵字p
結果 :
jgpob , ndpoh , stpoh , nepto

討論
這目前只是初步的概念 ,只是針對字串中的字母搜尋關鍵字母並作處理
未來要克服的包括 關鍵字串的設定, 文件檔案讀取更general, 及加入
if 等規則 等等等

吳堉光:EMG之Onset時間點分析


物理治療研究中,肌電圖(electromyography)是非常重要的研究工具之一,以下是我利用所教的while loop找出肌電訊號開始的時間點
EMG時間點

11/02/2006

林書如:您的體重過重嗎

前言:
BMI指數可以反映出體重是否處於理想狀態。過去已有許多文獻指出BMI指數過高往往是造成糖尿病、高血壓,甚至是心血管疾病的危險因子。因此,適度地監控自己的BMI指數是否處於正常值內是很重要的。

問題:
試寫出一個函數,當輸入體重和身高的數值後,能計算出其身體質量指數BMI值。並且依據其BMI值判斷其是否有體重過重或過輕的問題。(18.5<=BMI<24時顯示"體重標準",BMI>24時顯示"體重過重",BMI<18.5時顯示"體重過輕")

指令:

一開始我寫了一個比較簡單敘述檔案(Script file)

function [A]=BMI(w,h)
% BMI(Body Mass Index) calculation
A=w/h^2; % A means BMI
if 18.5<=A & A<24
fprintf('BMI=%0.2f 體重標準\n',A)
elseif A<18.5
fprintf('BMI=%0.2f 體重過輕\n',A)
else
fprintf('BMI=%0.2f 體重過重\n',A)
end

模擬輸出結果:

>> BMI(60,1.5)
BMI=26.67 體重過重

ans =

26.6667

結果顯示,一位體重60公斤,身高150公分的人,其BMI指數為26.67,有體重過重的傾向

==============================================

但是,為了能夠加上交談的功能,讓使用者更能清楚地了解應該輸入的內容
例如,輸入之體重應以公斤為單位,輸入之身高應以公尺為單位
因此我又改寫成另一個函數檔(function file),如下

% BMI2.m
% BMI(Body Mass Index) calculation
a=input('Please keyin your body weight? (kg)');
if isnumeric(a)
b=input('Please keyin your body height? (m)');
B=a/b^2; % B means BMI
if 18.5<=B & B<24
fprintf('BMI=%0.2f 體重標準\n',B)
elseif B<18.5
fprintf('BMI=%0.2f 體重過輕\n',B)
else
fprintf('BMI=%0.2f 體重過重\n',B)
end
end

模擬輸出結果:

>> BMI2
Please keyin your body weight? (kg)60
Please keyin your body height? (m)1.5
BMI=26.67 體重過重

結果同上,一位體重60公斤,身高150公分的人,其BMI指數為26.67,有體重過重的傾向

討論:

我是以簡單的if-elseif指令來撰寫這兩個小程式
程式中如果還有可以補強的地方(例如發現程式的bias,或是其實還有更簡單的寫法),還麻煩大家提供意見 :p