Labview and Matlab for PT

Just a place to discuss with Matlab and Labview

ad

Exam8.1

第一題
>> p=[133 0 122 0 0 1] % p=133x^5+122x^3+1

p =

133 0 122 0 0 1

>> q=[2 0 100 0 1] % q=2x^4+100x^2+1

q =

2 0 100 0 1

>> M=conv(p,q)

M =

Columns 1 through 9

266 0 13544 0 12333 2 122 100 0

Column 10

1

>> % p, q 兩多項式的乘積為 266x^9+13544x^7+12333x^5+2x^4+122x^3+100x^2+1

執行結果

第二題
>> p=[100 23 1 45];x=magic(5)

x =

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

以magic(5),x=每個元素帶入f(x)的答案為

>> f=polyval(p,x)

f =

498009 1395717 169 52725 342735
1228935 13125 35479 278967 415549
6817 22479 223645 809265 1075999
102355 176169 694267 936309 2955
135939 590715 1576945 939 74817

執行結果

第三題
>> p=[133 0 122 0 0 1] % p=133x^5+122x^3+1

p =

133 0 122 0 0 1

>> q=[2 0 100 0 1] % q=2x^4+100x^2+1

q =

2 0 100 0 1

>> [s,r]=deconv(p,q)

s =

66.5000 0


r =

1.0e+003 *

0 0 -6.5280 0 -0.0665 0.0010

>> % 商數s=66.5x 餘數r=e^3*(-6.528)x^3+e^3*(-0.0665)x+e^3*(0.001)

執行結果

第四題
>> p=[133 0 122 0 0 1] % p=133x^5+122x^3+1

p =

133 0 122 0 0 1

>> roots(p)

ans =

-0.0045 + 0.9578i
-0.0045 - 0.9578i
0.1039 + 0.1744i
0.1039 - 0.1744i
-0.1988

>> q=[2 0 100 0 1] % q=2x^4+100x^2+1

q =

2 0 100 0 1

>> roots(q)

ans =

0 + 7.0704i
0 - 7.0704i
0 + 0.1000i
0 - 0.1000i

執行結果

第五題
>> x=[1:9]; y=[1210, 1866, 2301, 2564, 2724, 2881, 2879, 2915, 3010];
>> p=polyfit(x,y,3)

p =

6.3047 -134.4603 994.3540 350.9127

>> f=@(a) (6.3047*a^3-134.4603*a^2+994.354*a+350.9127)

f =

@(a) (6.3047*a^3-134.4603*a^2+994.354*a+350.9127)

>> fplot(f,x)
>> hold on
>> plot(x,y)
>>

此題執行後,其polyfit的結果似乎只有x=1~2的時候比較符合,因為不管我限制多少範圍
做出來的圖x座標都是從1~2
然後將其和原圖放在一起
執行結果

Exam7.1

第一題
利用struct的方式撰寫

% student為整個struct的名稱 % 利用while的方式讓整個程式可以執行
student=struct('Name',0,'Age',0,'Sex',0,'Email',0);
ans='Y';
h=input('請問是否執行此資料程式?(Y/N) ', 's');
j=strcmp(upper(h),ans);
while j==1
if student(1).Name==0 %先判斷是否已經有存在資料庫
i=0;
else i=length(student);
end
fprintf('目前資料庫有%d筆資料',i);
e=input('請問是否新增?(Y/N)','s');
f=strcmp(upper(e),ans);
if f==0 %判別起始回答時是否因為尚未建立而要去修改
if i==0
disp('目前資料庫裡面沒有資料,請新增')
else
g=input('請問要修改哪一筆資料?');
i=g;
end
a=input('請輸入學生姓名(Name) ','s');
b=input('請輸入學生年齡(Age) ','s');
c=input('請輸入學生性別(Sex) ','s');
d=input('請輸入學生電子信箱(Email) ','s');
student(i)=struct('Name',{a},'Age',{b},'Sex',{c},'Email',{d});
elseif f==1
i=i+1;
a=input('請輸入學生姓名(Name) ','s');
b=input('請輸入學生年齡(Age) ','s');
c=input('請輸入學生性別(Sex) ','s');
d=input('請輸入學生電子信箱(Email) ','s');
student(i)=struct('Name',{a},'Age',{b},'Sex',{c},'Email',{d});
end
h=input('請問是否繼續執行此程式?(Y/N) ', 's');
j=strcmp(upper(h),ans); %決定是否要在繼續增加或修改資料
end

執行結果1
執行結果2

第二題
利用Menu和Switch的方式撰寫

clear all
close all
k=menu('請選擇你喜歡的品牌','Apple','Microsoft','IBM','Acer','Asus');
switch k
case 1
disp('活著其實很好,在吃一口蘋果')
case 2
disp('準備迎接windows vista')
case 3
disp('無敵黑金剛,金剛不壞之身')
case 4
disp('為王建名加油')
case 5
disp('華碩品質,以卵擊石')
end

程式執行圖
執行結果圖

第四題
原始資料檔案
在command window下利用xlsread和xlswrite的方式修改資料
>> [num text raw]=xlsread('D:/grade.xls');
>> raw(2,:)

ans =

'Eric' [1] [180] [110]

>> raw(2,:)={'Eric',1,178,100}

raw =

'Name' 'Sex' 'height' 'weight'
'Eric' [ 1] [ 178] [ 100]
'Jane' [ 0] [ 160] [ 50]
'Jolin' [ 0] [ 158] [ 45]
'David' [ 1] [ 175] [ 54]

>> xlswrite('D:\grade.xls',raw)
程式執行圖
執行結果圖
確實在exel裡面修改了資料

Exam6.1

第一題
自由落體:0~30s的時間內位置的高度的變化
>> t=(0:0.2:30);
>> height=freebody(t);
>> plot(t,height)
>> xlabel('time(s)');ylabel('height(cm)');
>> height
結果圖1 結果圖2

第二題
以半徑3和5並以圓心(0,0) and (10, 0) cm作圖
function drawcircles(r) % 主函數
% Draw circles with radii of r.
global MAXR i;
n=length(r);
MAXR=max(r);
hold on;
for i=1:n,
[X,Y]=circ(r(i));
plot(X,Y);
end
hold off;
axis equal;
end

function [x,y]=circ(rr) %次函數
% Calculate the points of a circle.
[xx,yy]=randxy;
theta=linspace(0,2*pi,60);
x=xx+rr*cos(theta);
y=yy+rr*sin(theta);
end

function [xx,yy]=randxy %次函數
global MAXR i
% locate the position of the center.
k=[0 10];l=[0 0];
xx=k(i);
yy=l(i);
end
作圖

第三題
以=3, b=5, 並且給予 y=[12 15 20] 然後以匿名函數作x²/a²+y²/b²
最後作圖在x=[3 4 5]的範圍下(應該是這樣吧,題意不是很懂)
a=3;b=5;
y=[12 15 20];
fplot(@(x) ((x.^2)./a^2+(y.^2)./b^2),[3 5])
結果圖

第四題
敘述檔為
Do=input('請輸入圓柱體的外半徑? ');
Di=input('請輸入圓柱體的內半徑? ');
height=input('請輸入圓柱體的高? ');
[a,b,c]=cylin(Do,Di,height);
fprintf('圓柱體的體積為%f,上表面積%f,側面面積%f\n',a,b,c)

呼叫function cylin
% function cylin %
function [volume,upper_face,side]=cylin(Do,Di,height);
volume=(Do./2-Di./2).^2*pi.*height; %體積
upper_face=pi*(Do./2-Di./2).^2; %上表面積
side=2*pi*(Do./2-Di./2).*height; %側面面積

結果在這

第五題
將程式改成呼叫外部的函數,並且設立global variable,即可將polyx移到原本的函數外面
而非原先的巢狀函數

function [rr_array]=nest_fun1(x,a)
%function to find sets of polynormials.
% a: set of constants, [A B C]
% x: variables in array
% Example: rr=nest_fun(2:10,[1 2 4;2 4 8])
n=size(a);
global A B C x
for i=1:n
A=a(i,1);B=a(i,2);C=a(i,3);
rr_array{1,i}=['A=',num2str(A),', B=',...
num2str(B),', C=',num2str(C)];
rr_array{2,i}=polyx(x);
end
end

function [r]=polyx(xx)
global A B C x
r=A.*x.^2 + B.*x +C;
end


結果在這

第六題

function pillar(Do,Di,height)
% Find the volume of a hollow pillar
% ro,ri:outside & inside diameters
if nargin<1
height=1;
Di=0;
Do=1;
volume=abs(Do.^2-Di.^2).*height*pi/4;
fprintf('體積為%f(預設高為%d內面積%d外面積%d)\n',volume,height,Di,Do);
end
if nargin<2 & nargin>0
height=1;
Di=0;
volume=abs(Do.^2-Di.^2).*height*pi/4;
fprintf('體積為%f(預設高為%d內面積%d)\n',volume,height,Di);
end
if nargin<3 & nargin>1
height=1;
volume=abs(Do.^2-Di.^2).*height*pi/4;
fprintf('體積為%f(預設高為%d)\n',volume,height);
end
if nargin==3
volume=abs(Do.^2-Di.^2).*height*pi/4;
fprintf('體積為%f\n',volume);
end


結果在這

Labview的濾波功能

  話說現在的labview功能越來越強大了,
如果有看過Matlab簡易濾波器的話,看到這篇
之後應該會很想扁人。

  看不清處嗎?那就按這邊下載


  沒錯,就是這樣,開檔,濾波,畫圖。

Matlab簡易的濾波功能


  首先我必須先聲明的是,我對於濾波的真正原理是
一知半解,但是他在我們物理治療中的訊號分析裡面,
卻是扮演著重要的角色。

  什麼事butterworth的濾波,說真的我真的不知道,
反正數位濾波器就以這樣設計就好。

  看到這裡如果你非常想打我的話,元智大學最佳化
實驗室有份文件大家可以參考看看。按我看看

  言歸正傳,反正濾波器有高通,低通,帶通,帶拒
四大類,於是乎我利用了matlab裡面的butter函數,以
及filter設計了這個含有四種功能的濾波器function,
內容很簡單,只不過利用了switch的方式選擇。
點我看看這個簡易的濾波功能

  如果有興趣試試看的話,這裡提供了一筆資料可以
試試看請以右鍵點選下載

  這分資料裡面,第一列跟最後一列分別都是force的
資料,中間幾個才是肌電圖,其取樣頻率為1000/s。

Exam5.1答案

作業5.1 吳堉光
第一題:
利用陣列轉換函數(cat)依所指定的方向合併(concatenates)陣列A,B
程式碼:
A=magic(3);B=rand(3,3)*10;
cat(3,A,B)
或是直接
cat(3,magic(3),rand(3,3)*10)
執行結果

第二題:
將兩個陣列以水平或是垂直的方式合併,或是利用不同page的方式合併
水平合併的方式可以有兩種
A=[45 89 99; 12 34 55];B=[15 25 45; 65 50 30];
[A,B]
cat(2,A,B)
即可得到水平合併,點我看結果

垂直合併的方式也有兩種
A=[45 89 99; 12 34 55];B=[15 25 45; 65 50 30];
[A;B]
cat(1,A,B)
即可得到垂直合併,點我看結果

以不同page儲存的方式則要利用cat函數
A=[45 89 99; 12 34 55];B=[15 25 45; 65 50 30];
cat(3,A,B)
即可得到以不同page儲存,點我看結果

第三題
將A,B兩陣列以指定的位置放入page中
方式一
M(:,:,1)=A; M(:,:,2)=B; M(:,:,3)=A; M(:,:,4)=B;
執行結果
方式二
如果今天有大量的陣列放入而且是有規則性的放入的話,可以以for迴圈來執行
A=[45 89 99; 12 34 55];B=[15 25 45; 65 50 30];
for i=1:2
M(:,:,2*i-1)=A;
M(:,:,2*i)=B;
end

第四題
依題意看起來應該是要形成一個3 x 2的cell array
所以可以直接利用cell array的{}的方式
c={'Eric' [90 100]; 'Peter' [35 60]; 'Jan' [77 67]}
所形成的結果以cellplot的方式來表示
結果在這裡

第五題
將資料建構成一個struct的陣列
程式如下
patient(1).name='Philip';
patient(2).name='Peter';
patient(3).name='Roberts';
patient(4).name='Roe';
patient(1).Age=35;
patient(2).Age=45;
patient(3).Age=55;
patient(4).Age=60;
patient(1).salary=50000;
patient(2).salary=40000;
patient(3).salary=80000;
patient(4).salary=120000;
即可以建構出struct的陣列
不過這樣一個一個key實在挺累人的

Exam4.1答案

第一題:
% 求兩個向量的外積的單位向量
% A=3i +5j +10k B=5i -6j +2k
A=[3 5 10];B=[5 -6 2];
m=cross(A,B);
r=sqrt(m*m');
u=m/r

第二題
由於在計算平均值,中位數時其syntax中(A,dim)當dim不寫或是1時,所計算的為每一行的平均值及中位數,而當填入為2時則為計算列
Mean&Median

而std其syntax
flag=0時為sample的標準差,而flag=1為population
STD

第三題
根據老師上所講的尤拉公式,在command windows下證明
證明結果

第四題
計算複數所成的陣列的絕對值,夾角,實部,虛部
絕對值,夾角
實部,虛部

Exam3.1答案

第一題:
個人認為減少迴圈加快執行的方式為
n=(1:50).^2;
reshape(n,5,10)
這樣可以得到相同的答案

第二題
A=magic(5);
for n=1:5
for m=1:5
if A(n,m)>10
A(n,m)=NaN;
end
end
end
即利用迴圈一一的去檢查是否符合條件,符合的就替換成NaN

第三題
A=magic(5);
for n=1:5
for m=1:5
if isprime(A(n,m))
A(n,m)=0;
end
end
end
和第二題一樣,以迴圈的方式去檢測

第四題
將no_of_draw改成[100:100:1000]會發現到結果和no_of_draw的答案差不多,也就是只會執行100次,我們可以利用
a=100;b=(100:100:1000);
c=(a==b)
c=[1 0 0 0 0 0 0 0 0 0]
我想應該是這樣,所以程式裡面的條件
while n<=no_of_draw
因為第一個元素不符條件了,所以程式結束。
如果要一次全部呈現可以改成如下程式
function [B]=draw_number(no_of_draw)
% draw ball numbers within ndraw times
%
for i=1:length(no_of_draw)
C_i=zeros(1,5);
n=1;
while n<=no_of_draw(1,i)
ball=fix(rand*10);
if ball<2
C_i(1)=C_i(1)+1;
elseif ball<4,
C_i(2)=C_i(2)+1;
elseif ball<6,
C_i(3)=C_i(3)+1;
elseif ball<8,
C_i(4)=C_i(4)+1;
else
C_i(5)=C_i(5)+1;
end
n=n+1;
end
B(i,1:5)=C_i;
end
第五題
clear all
k=input('Please input a number to compare? (0-100)');
l=input('Please input the total number to do?');
a=round(k);
n=0;
num=0;
answer=0;
if a>=0 & a<=100
for i=1:l
while round(rand*100)~=a
n=n+1;
end
num=num+1/n;
end
answer=num/100;
fprintf('%d%s%d%s%f\n',l,'次抽中和',a,'相同的號碼機率為千分之',answer*1000);
else
fprintf('%s\n','你所輸入的號碼範圍號碼不對')
end
可以同時輸入號碼跟比對次數

EMG之Onset時間點


  在我們物理治療研究中,不管是研究肌械延遲(electrical mechanical delay),或是病人對於肌肉張力,運動員之力量發展,都需要靠肌電訊號來告訴我們,其中有一個最重要的部份就是,去知道該塊肌肉什麼時候開始動作。

下載檔案(點右鍵下載此檔案)
  其中,前三條分別為我們下肢小腿後側肌群。最後一條為實驗時我用數位類比轉換卡發出的類比訊號給儀器接收,以作為同步訊號。不過目前先不將同步訊號考慮在內。

  我們必須要去找到開始的時間點,此時就要利用到統計學的概念,兩個母群若是差兩個標準差的話,就可以稱作是兩個不同的母群(否決虛無假設)。
不過很不幸的是,通常訊號可能沒有那麼漂亮,或是雜訊很多,可能需要到三個甚至四個標準差以上。

點此下載看上圖
程式檔案

  這個程式就是靠while+break所寫成的,當找到符合條件的點後,就結束迴圈,並且輸出結果。