簡單的濾波器製作
對於擷取肌電圖(EMG)時,擷取到的資料對於我們而言
並不是都是有意義的,有時候常常會收取到一些雜訊,例如直
流電所產生的60Hz的雜訊,或是其實我們收取EMG的訊號以取
樣頻率1000為例,大多介於20-500之間。
因此濾波對於我們肌電訊號的分析格外重要。這裡撰寫了
一個非常簡單的濾波功能。有興趣的話可以點我看看。或是按
標題也可以連結。
The blog is for students who attend the course of 'Applications of Matlab in Engineering' to submit their homeworks, discussions and classnotes. Related blog can be refered to http://bime-matlab.blogspot.com. Students's work should be posted to this blog through a specified email address under a preset or self-defined title with proper contents. Students also have to leave their comments consistently to all the posted titles. Both posting material and comments will be graded later.
對於擷取肌電圖(EMG)時,擷取到的資料對於我們而言
並不是都是有意義的,有時候常常會收取到一些雜訊,例如直
流電所產生的60Hz的雜訊,或是其實我們收取EMG的訊號以取
樣頻率1000為例,大多介於20-500之間。
因此濾波對於我們肌電訊號的分析格外重要。這裡撰寫了
一個非常簡單的濾波功能。有興趣的話可以點我看看。或是按
標題也可以連結。
張貼者:
Eric Wu
於
11/13/2006 06:27:00 下午
0
意見
標籤: 吳堉光
張貼者:
不留白老人
於
11/11/2006 12:43:00 下午
0
意見
前言:早前出差去使用經緯儀,希望能用兩種角度去作定位
問題:如何在只有兩組經緯儀的角度下作空間點群的定位,在建立公式以及程式後,發覺程式當時剛學技巧有需要改進且似乎這樣的計算是有錯的,希望大家幫忙想
程式流程:
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
張貼者:
黃世榮
於
11/03/2006 02:02:00 下午
0
意見
標籤: 黃世榮
前言:
本來構想是希望作一個可以將老師部落格上面
關於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 等規則 等等等
張貼者:
Ching 吳子青
於
11/03/2006 12:11:00 下午
0
意見
標籤: 吳子青
物理治療研究中,肌電圖(electromyography)是非常重要的研究工具之一,以下是我利用所教的while loop找出肌電訊號開始的時間點
EMG時間點
張貼者:
Eric Wu
於
11/03/2006 12:05:00 下午
2
意見
標籤: 吳堉光
前言:
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
張貼者:
ShuRuLin
於
11/02/2006 07:52:00 下午
3
意見
標籤: 林書如
前言:
最近又到了選舉期了 在電視媒體或報章雜誌常常可以看到
“ 某某參選人支持率多少”…
民意支持率各家都宣稱客觀公正,但其實是可以操作的
在這裡舉出一個以前碰過的問題讓大家思考一下
問題:
若台北市某候選人的真實 “民意支持率”為15%,找出使調查樣本的
民意支持率超過0.18 的出現機率不大於 10% 的最小樣本數 N。
----------------------------------------------------------------------
答案:
題旨與分析
這問題的思考流程是這樣的
將全部台北市民當成一個族群,而調查的對象代表抽樣的樣本
“某候選人的真實民意支持率為15%” 這句話的意思就是代表族群的支持率
而調查樣本的民意支持率就是樣本的支持 率。
將這問題視為一個二項式分佈的問題,也就是支持和不支持兩種情況
支持的機率 P=0.15 不支持的機率 Q=0.85
舉例說明
如果某一次的抽樣從台北市民隨機抽10個人 (Sample Size m=10)
10個人中支持候選的人有2個人,不支持的有8個人
這個事件出現的機率為http://photos1.blogger.com/blogger2/2907/859880749988154/1600/formula1.jpg
所以如果問題是 ”找出使調查樣本的民意支持率超過0.18”
如果抽樣人數維持10人,支持人數大於1.8的都符合條件
也就是支持人數 2 到10人分別算出的機率加總。
題目所求是 “出現機率不大於 10% 的最小樣本數 N。”所以從n=1
開始算到符合出現機率不大於10%為止。
程式流程
Step 1 : 宣告function p1(m,n) 為抽樣m個人,有n個人支持的機率
Step 2 : 計算A為抽樣m個人,支持率超過0.18的機率總和
Step 3 : 從m=1 開始增加用For 跑迴圈,決定停止條件為A < >程式內容
/ p1.m / (* 這行代表m-files p1.n 開始 *)
張貼者:
Ching 吳子青
於
10/25/2006 08:05:00 下午
4
意見
標籤: 吳子青
氣體在特定容器下,其壓力、體積與溫度間之關係如下:
P=nRT/V
這是波義耳的氣體公式,但萬得爾(van der Vaals)公式則加入分子間之引力因素。其關係如下:
P=nRT/(V-nb)-an²/V²
其中,a,b分別為氣體之特定常數。理想氣體在n=1摩爾數下,溫度在0C(273.2K)下,氣壓為一大氣壓時,具有體積為22.4公升,其R值為0.0826。對於氯氣而言,上述之a,b值分別為a=6.49,b=0.0562。試就上兩公式計算其壓力差。
張貼者:
不留白老人
於
10/19/2006 10:47:00 下午
2
意見
標籤: PROBLEM
若採用定存的方式,每個月存放一定的數額(例如每個月五百元),銀行年息5%。
1. 問何時可以達到10,000,000元?
2. 若改為每週存入原每月存放額度之四分之一,則何時可以達到10,000,000元?
張貼者:
不留白老人
於
10/19/2006 10:45:00 下午
5
意見
標籤: PROBLEM
有一個很好玩的數字遊戯是:假設第一天到銀行存一分錢,第二天存二分錢,第三天三分錢,如此累積,問何時可以累積到10,000,000元?(設銀行的年息為5%)
張貼者:
不留白老人
於
10/19/2006 10:44:00 下午
4
意見
標籤: PROBLEM
請使用最簡單之指令,製作一個9X9之九九乘法表,其中之項目格式為 3 x 4 = 12 3 x5 = 15 ...。
張貼者:
不留白老人
於
10/11/2006 11:23:00 上午
2
意見
標籤: PROBLEM
五月份的台北天氣已經開始轉熱,其整月的日平均溫度如下:
T=[25 26 24 23, 18 17 20 30 29, 25 19 19 21 20, 23 24 23 25 23,…
27 28 24 26 27, 23 25 24 21 19, 20]C
1. 試撰寫一程式,以上述之溫度資料為輸入值,求其月平均、最高及最低溫度。
2. 試撰寫另一程式,以交談式輸入之方式,按月份輸入每日之溫度,(必須分清楚每月應有之輸入日數)然後呼叫第一項之程式進行分析。
註:請同學針對本題目直接回應(COMMENT),請勿採用EMAIL方式提交。
張貼者:
不留白老人
於
10/10/2006 11:50:00 上午
6
意見
標籤: PROBLEM
在抛物運動中,設初值分別為速度ν及仰角θ,試其投射之最高高度、最遠距離。已知ν= [ 10 15 20 25 ] m/s,其對應θ=[30 40 50 60]度。
1. 試撰寫一函數,並繪出其投射之軌跡。
2. 同上題,若發射點高於平面100m時,求其對應之狀況。
3. 同上題,求物體自發射後,其著地之時間。
註:請同學針對本題目直接回應(COMMENT),請勿採用EMAIL方式提交。
張貼者:
不留白老人
於
10/10/2006 11:46:00 上午
5
意見
標籤: PROBLEM
註:請同學針對本題目直接回應(COMMENT),請勿採用EMAIL方式提交。
張貼者:
不留白老人
於
10/10/2006 11:30:00 上午
4
意見
標籤: PROBLEM
第一題
題意:
(A)把B矩陣單位由華氏溫度轉為攝氏溫度
(B)把溫度超過(>38℃)定義為"1",而沒有超過(<38℃)定義為"0"
分析:
(A)先定義矩陣B,把B用公式轉換成攝氏溫度
(B)把換算出來的攝氏溫度,再和38℃比較,再定義超過(>38℃)定義為"1",而沒有超過
(<38℃)定義為"0"
程式流程:
(A)>>B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5]; %Their temperatures
measured
>>C=(B-32)*5/9 %Converse the unit of B into Centigrade
C =
36.6667 37.7778 38.8889 40.0000 36.8889 36.7778 36.9444
38.3333 38.8889 37.5000
(B)>> D=C>38 %design Dto show that "1" for the one who has a fever (>38℃
) and "0" for the normal
D =
0 0 1 1 0 0 0 1 1 0
結果:
(A)C =36.6667 37.7778 38.8889 40.0000 36.8889 36.7778 36.9444
38.3333 38.8889 37.5000
(B)D =0 0 1 1 0 0 0 1 1 0
討論:
若是在每個矩陣中的數字可以定義其所代表的名字,若是其中有人超過,就可以立即知道
其名
第二題
題意:
比較A、B矩陣的相關:(A)D=(A>B)(B)D=(A>5)(C)D=A+B
分析:
比較其矩陣的各項和題意的相互關係
程式流程:
(A)>> A=[-10 8 6 4 -5 20];
>>B=[2 8 5 10 -6 3];
>> D=(A>B) %當A大於B時,定義當A>B為真時,表為"1",為假時表為"0"
D =
0 0 1 0 1 1
(B)>> D=(A>5) %當A大於5時,定義當A>B為真時,表為"1",為假時表為"0
D =
0 1 1 0 0 1
(C)>> D=A+B %把A、B矩陣相加
D =
-8 16 11 14 -11 23
結果:
(A)D =0 0 1 0 1 1
(B) D =0 1 1 0 0 1
(C) D =-8 16 11 14 -11 23
討論:
學會如何使用比大小
第三題
題意:
做矩陣加減乘除法和三角函數運算
分析:
先確定矩陣的大小是否符合加減乘除所須之維度,在做運算\
程式流程:
>> x=[10 20 30];
>>y=[1 4 6];
>> A=3*x+y
A =
31 64 96
>> B=5*y./x
B =
0.5000 1.0000 1.0000
>> C=(4*x).*(2*y)
C =
80 640 1440
>> D=sin(x).*cos(y)
D =
-0.2939 -0.5967 -0.9487 %三角函數以逕度量進行運算
>> E=(5*x).*sin(2*y)
E =
45.4649 98.9358 -80.4859
討論:是矩陣中的單元對應的相加減乘除,而不是矩陣的乘除,所以要注意其"."位子
第四題:
題意:在M-file中做運算,紀錄其工作列,在運算視窗中直接叫出
分析:按File後New後M-file在其中做串聯和並聯電阻的運算,在紀錄在Work裡,在Matlab
中把檔案叫出
程式流程:
1- R=[10 30 200 400];
2- series=sum(R)%串聯電阻
3- parallel=1/(sum(1./R))%並聯電阻
(紀錄在Untitled.m)
>> untitled
series =
640
parallel =
7.1006
討論:在M-file中做運算,若是非常大的運算,是非常好用的方法
第五題:
題意:把一個A矩陣(1-24)變成3*8,6*4,2*12矩陣大小
分析:使用reshape(X,Y,Z)
結果:
>> A=1:24
A =
Columns 1 through 13
1 2 3 4 5 6 7 8 9 10 11 12 13
Columns 14 through 24
14 15 16 17 18 19 20 21 22 23 24
>> B=reshape(A,3,8)
B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
>> C=reshape(A,6,4)
C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
>> D=reshape(A,2,12)
D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
_________________________________________________________________
MSN 交友和 Match.com 為您線上尋找您週圍的單身貴族!
張貼者:
不留白老人
於
10/07/2006 12:00:00 上午
0
意見
標籤: 林冠宏
程式內容及結果:
>> x=[10 20 30]
x =
10 20 30
>> y=[1 4 6],
y =
1 4 6
a小題
>> A=3*x+y
A =
31 64 96
b小題
>> B=5*y./x
B =
0.5000 1.0000 1.0000
c小題
>> C=4*(2*y)
C =
8 32 48
d小題
>> D=sind(x).*cosd(y)
D =
0.1736 0.3412 0.4973
e小題
>> E=(5*x).*sind(2*y)
E =
1.7450 13.9173 31.1868
討論: 在d、e小題,學生於原本程式中相乘的部份沒有加上dot,所以程式會給了一個這樣的結果??? Error using ==> mtimesInner matrix dimensions must agree.學生才想起來上課老師教過矩陣之間元素要各自運算的話要在乘除符號之前加上一個dot符號,於是加上一個dot符號結果就正確了!
分析:因為要把array當中每ㄧ個元素的值各自提出,才能做電阻串並聯的運算,所以要利用到老師上課教到的矩陣次標功能
程式內容:
R=[ 10 30 200 400]
series=R(1,1)+R(1,2)+R(1,3)+R(1,4)%4個電阻串聯
parallel=1/((1/R(1,1))+(1/R(1,2))+(1/R(1,3))+(1/R(1,4)))%4個電阻並聯
程式結果:
R =
10 30 200 400
series =
640
parallel =
7.1006
分析: 此題要利用到老師講義中矩陣重組reshape這一個指令,就可以改變原先矩陣的形式
程式內容及結果:
>> B=reshape(A,3,8)
B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
>> C=reshape(A,6,4)
C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
>> D=reshape(A,2,12)
D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
討論:我們想要的列、行數只要填在reshape指令括號中的第2、3位置,矩陣就會轉換成我們想要的大小
張貼者:
???
於
10/06/2006 03:33:00 下午
0
意見
標籤: 唐翊凱
第一題:
題旨:將量測的華式溫度轉換成攝氏後,找出體溫大於38的人,以矩陣D表示.當大於38顯示為1,小於則為0.
分析:將B矩陣中所有的元素進行轉換後,與38比較大小顯示於矩陣D.再利用尋找非零元素的方法,顯示其位置而容易尋找.
程式流程與分析:
>> clear
>> B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5];
>> C=(B-32).*5/9; %華式溫標轉換成攝氏溫標的轉換公式
>> D=C>38
D =
0 0 1 1 0 0 0 1 1 0
>> [E]=find(D) %尋找非零元素並顯示其位址
E =
3 4 8 9
討論:雖然題目的要求只有顯示D矩陣,但是如果當被測者數量眾多(資料量龐大),海關人員難以尋找到底是哪一位的體溫超過38度,所以後面加了一個command,使得最後顯示為超過38度的人的序號,如果是二維矩陣則為位址.
第二題:
題旨:矩陣A與B,利用MATLAB程式進行比較,將結果顯示於D.
分析:當進行矩陣的運算時,要先注意其維數是否符合進行運算的條件.如果為矩陣與常數運算,則無此顧慮,但運算元前面要加"."
程式流程與分析:
>> clear
>> A=[-10 8 6 4 -5 20];B=[2 8 5 10 -6 3];
>> D=(A>B)
D =
0 0 1 0 1 1
>> D=(A>5)
D =
0 1 1 0 0 1 %比大小時,當符合則顯示1,不符合則顯示0
>> D=A+B
D =
-8 16 11 14 -11 23
討論:此題的兩個矩陣維數相同,所以能輕易進行運算.
第三題:
題旨:兩個矩陣x與y,進行加減乘除運算
分析:跟第二題一樣,矩陣進行運算須注意其維度,因為此為兩個列矩陣,無法進行矩陣乘除,只能讓相同位址的元素進行運算,此時運算元間要加".",常數則不用,而三角則直接進行元素的運算.
程式流程與分析:
>> clear
>> x=[10 20 30];y=[1 4 6];
>> A=3*x+y
A =
31 64 96
>> B=5*y./x
B =
0.5000 1.0000 1.0000
>> C=4*x.*(2*y)
C =
80 640 1440
>> D=sin(x).*cos(y)
D =
-0.2939 -0.5967 -0.9487 %三角函數以逕度量進行運算
>> E=5*x.*sin(2*y)
E =
45.4649 98.9358 -80.4859
討論:當沒有加上"."號時,程式會告知無法計算.三角函數則以逕度量進行運算,如果要以角度進行運算,指令為sind與cosd.
第四題:
題旨:建立M-file,先在檔案中將程式打好,然後在matlab主程式中呼叫即可.
分析:建立M-file的路徑"file->new->M-file",程式打好後存檔,在matlab主程式中,直接輸入M-file的檔名即可執行.
程式流程與分析:
1.M-file:
R=[10 30 200 400];
series=sum(R) %串聯的總電阻為全部相加
parallel=1/sum(1./R) %並聯的總電阻為全部的倒數相加的倒數
(檔名:resistor)
2.matlab主程式
>> clear
>> resistor
series =
640
parallel =
7.1006
討論:M-file可以很方便的用來debug,尤其當程式很大的時候.此程式的另一個方法可以使用函數檔.如果需要常常用到相同的計算式時,可以利用M-file製成函數檔,只須呼叫並將變數帶入即可.
第五題:
題旨:一個1~24的矩陣A,將它變成3x8,6x4,2x12的矩陣.
分析:利用resharp的指令來改變其行列.
程式流程與分析:
>> clear
>> A=1:24
A =
Columns 1 through 13
1 2 3 4 5 6 7 8 9 10 11 12 13
Columns 14 through 24
14 15 16 17 18 19 20 21 22 23 24
>> B=reshape(A,3,8)
B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
>> C=reshape(A,6,4)
C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
>> D=reshape(A,2,12)
D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
討論:建立一個元素為連續的矩陣時,可用":",可以省去麻煩.使用resharp指令時,要注意行數與列數的相乘是否符合,否則無法resharp.
張貼者:
MattLin
於
10/06/2006 09:22:00 上午
0
意見
標籤: 林翊展
>> % Quesiotn 1
>> % 題旨:將華氏溫度轉換為攝氏溫度,並且定義出溫度大於38度c者為1
>> B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5]; % 所有被測者的華氏體溫
>> c=(B-32)*5/9 % 將華氏溫度換算為攝氏溫度
c =
Columns 1 through 8
36.6667 37.7778 38.8889 40.0000 36.8889 36.7778
36.9444 38.3333
Columns 9 through 10
38.8889 37.5000
>> D=c>38 % 將攝氏溫度大於38度c者定義為1,得一新矩陣D
D =
0 0 1 1 0 0 0 1 1 0
>> % 執行結果: 換算後的攝氏溫度為[36.6667 37.7778 38.8889 40.0000 36.8889 36.7778
>> 36.9444 38.3333 38.8889 37.5000]; 定義體溫大於38度c的matrix D=[0 0 1 1 0 0
>> 0 1 1 0]
>> % 討論: 定義出高體溫者之後,若現實上受測者有編號,則可以利用尋找索引值的方式輕易找出高體溫者為誰
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>> % Quesiotn 2
>> % 題旨:比較矩陣A與矩陣B
>> A=[-10 8 6 4 -5 20];
>> B=[2 8 5 10 -6 3];
>> D=A>B % 矩陣A與矩陣B一對一比較,A>B者定義為1,其餘為0
D =
0 0 1 0 1 1
>> D=A>5 % 矩陣A中數值>5者定義為1,其餘為0
D =
0 1 1 0 0 1
>> D=A+B % 將矩陣A與矩陣B相加
D =
-8 16 11 14 -11 23
>> % 執行結果: (1) D=[0 0 1 0 1 1] (2) D= [0 1 1 0 0 1] (3) D=[-8 16 11 14 -11 23]
>> % 討論:矩陣A與矩陣B排列相同,因此兩者可以直接做比較與計算
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>> % Quesiotn 3
>> % 題旨:進行矩陣x與矩陣y之計算
>> x=[10 20 30];
>> y=[1 4 6];
>> A=3*x+y
A =
31 64 96
>> B=5*y./x
B =
0.5000 1.0000 1.0000
>> C=4*2*y
C =
8 32 48
>> D=sin(x).*cos(y)
D =
-0.2939 -0.5967 -0.9487
>> E=5*x.*sin(2*y)
E =
45.4649 98.9358 -80.4859
>> % 執行結果: A= [31 64 96], B= [0.5000 1.0000 1.0000], C=[8 32 48], D=
>> [-0.2939 -0.5967 -0.9487], E= [45.4649 98.9358 -80.4859]
>> % 討論:重點在於元素對元素的計算符號是在矩陣的計算符號之前加上"."
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
% Quesiotn 3
% 題旨:撰寫一個計算多個電阻分別串聯與並聯後之總電阻的M-file
R=[10 30 200 400];
R1=sum(R) % 串聯後之總電阻R1為四個電阻之總合 R1=r1+r2+r3+r4
R2=1/sum(1./R) % 並聯後之總電阻R2=1/(1/r1+1/r2+1/r3+1/r4)
>> % 在command window下執行M-file
>> % 執行結果: 串聯後之總電阻R1為640歐姆; 並聯後之總電阻R2為7.1006歐姆
>> % 討論:計算R矩陣中各個element的倒數不能單純以1/R指令執行,而需在/之前加上.才可順利算出數值
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>> % Question 5
>> % 將矩陣A(1x24)轉置為B (3x8), C(6x4), D(2x12)三種不同排列方式之矩陣
>> A=[1:24];
>> B=reshape(A,3,8)
B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
>> C=reshape(A,6,4)
C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
>> D=reshape(A,2,12)
D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
>> % 執行結果:如上所示之B、C、D三矩陣
>> %
>> 討論:使用reshape(A,m,n)方式將陣列A的元素由上到下,由左到右的次序重新排列成一個新的m×n的矩陣。使用reshape函數時,重排後矩陣元素的個數必須與原矩陣相同。
張貼者:
不留白老人
於
10/05/2006 11:21:00 下午
0
意見
標籤: 林書如
題旨:找出哪些人超過38度西,超過只為1,其他為0。
分析:Step1. 先要知道華氏和攝氏的單位換算
Step2. 利用MATLAB的比較關係即可得到1或0。
程式內容:
B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5];
C=(B-32)/9*5;
D=(C>38)
執行結果:
D = 0 0 1 1 0 0 0 1 1 0
討論:
矩陣需要等維才能作相加減,但是在攝氏與華氏轉換公式中亦可使用C=(B-32.)/9*5,單一元素與等值的的的。
===============================================================
題旨:給兩個A與B陣列,試去比較與相加。
分析:Step1. 陣列比較時先判別是否等維數
Step2. 依題意進行A與B的比較與相加,比較是將以1與0表示,相加減時為相對元素直接相加減。
程式內容與結果:
A=[ -10 8 6 4 -5 20];
B=[2 8 5 10 -6 3];
D= (A>B)
D = 0 0 1 0 1 1
D= (A>5)
D = 0 1 1 0 0 1
D=A+B
D = -8 16 11 14 -11 23
討論:
剛開始需判斷是否為相同維數,而在比較時由於為『大於』,所以『等於』與『小於』其獲得直接為0只有大於是才為1。當陣列相加時,由於是相同維數的陣列,故MATLAB將相對的元素進行相加即為所求。
===============================================================
題旨:給兩個x與y陣列,進行陣列的加減乘除的基本運算。
分析:Step1. 陣列維數相同時即可直接進行相加減
Step2. 遇到陣列相乘除時,由於是陣列的關係所以需加註『.』來表示陣列,遇到三角函數表示時,需將整個函數視為一陣列來進行計算。
程式內容與結果:
x=[10 20 30];
y=[1 4 6];
A=3*x+y
A = 31 64 96
B=5*y./x
B = 0.5000 1.0000 1.0000
C=4*x.*(2*y)
C = 80 640 1440
D=sin(x).*cos(y)
D = -0.2939 -0.5967 -0.9487
E=5*x.*sin(2*y)
E = 45.4649 98.9358 -80.4859
討論:
此題主要是練習陣列的乘除計算,特別需注意的是兩陣列相乘除時,需要加標註『.』來表示陣列,所以MATLAB就以『.*』與『./』為陣列的乘除符號,即可得到所求。
===============================================================
題旨:建立一M檔案,將題目所給的R電阻陣列進行串連與並連的計算。
分析:Step1. 先開啟先的檔案,儲存後即為M檔案
Step2. 利用sum的指令即可進行元素的相加
Step3. 注意串連與並連的表示方式
程式內容:
M-FILE:
function ex4(R)
S=sum(R)
P=1/sum(1./R)
結果:
ex4([10 30 200 400])
S = 640
P = 7.1006
討論:
本題主要是練習sum指令的運用,值得注意的地方就是R為一陣列,所以在進行相除時需以『./』的方式進行運算,其結果即為所求。
===============================================================
題旨:A為一從1到24的陣列形式排列(1x24),試將A陣列變換成其他維數的矩陣表示之。
分析:Step1. A為一陣列,所以需先輸入A值來定義其陣列
Step2.在變換成其他維度矩陣時,需利用指令reshape,其指令可將矩陣重新編排其行列。
程式內容與結果:
A=1:24
A =
Columns 1 through 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Columns 18 through 24
18 19 20 21 22 23 24
B=reshape(A,3,8)
B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
C=reshape(A,6,4)
C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
D=reshape(A,2,12)
D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
討論:
此題為練習單一陣列的維數變換,既將一陣列變換成多維矩陣,其指令reshape即能變換成其他維數的矩陣,值得注意的是原A為1x24的陣列,若是變換其他形式的矩陣時也需行與列的排數相乘為24,若是不以24表示,其元素將為不足,MATLAB無法表示。
張貼者:
不留白老人
於
10/05/2006 10:56:00 下午
0
意見
%%%%%%%%%%%%%%
% Question 1 %
%%%%%%%%%%%%%%
%題旨:將體溫矩陣轉換成攝氏並以38C作為判斷體溫是否過高的布林陣列
%分析與程式流程:
%首先將以華式為單位的B轉換為以攝氏為單位的C
%再將矩陣C以攝氏38度為判斷準則,利用">"作為判斷並且存以陣列D
%程式內容
clear all
B=[98 100 102 104 98.4 98.2 98.5 101 102 99.5];
C=(B-32)*5/9;
Q1_D=(C>38)
%%%%%%%%%%%%%%
% Question 2 %
%%%%%%%%%%%%%%
%題旨:矩陣的各個元素的比較以及element之間的運算
%分析與程式流程:
%先定義出兩個變數分別為A和B
%進行矩陣的比較及運算
%程式內容
clear all
A=[ -10 8 6 4 -5 20];
B=[2 8 5 10 -6 3];
Q2_D_a=(A>B)
Q2_D_b=(A>5)
Q2_D_c=(A+B)
%%%%%%%%%%%%%%
% Question 3 %
%%%%%%%%%%%%%%
%題旨:矩陣的基本運算
%分析與程式流程:
%先定義出兩個變數分別為x和y
%進行矩陣的運算
%程式內容
clear all
x=[10 20 30];
y=[1 4 6];
Q3_a=3*x+y
Q3_b=5*y./x
Q3_b_1=5*y/x
Q3_c=4*x*2.*y
Q3_d=sin(x).*cos(y)
Q3_e=5*x.*sin(2*y)
%%%%%%%%%%%%%%
% Question 4 %
%%%%%%%%%%%%%%
%題旨:利用矩陣的方式求出電阻的串聯並聯
%分析與程式流程:
%先定義R的電阻形成的矩陣
%以sum函數求出矩陣內的總和以並聯公式求出並聯電阻
%程式內容
clear all
R=[10 30 200 400];
Q4_R_s=sum(R)
Q4_R_p=1/(sum(1./R))
%%%%%%%%%%%%%%
% Question 5 %
%%%%%%%%%%%%%%
%題旨:矩陣A是一個1x24的列矩陣,將矩陣A利用reshape指令分別變化成
%矩陣B(3x8) 矩陣C(6x4) 矩陣D(2x12)
%分析與程式流程:
%矩陣A=1:24 為一從1遞增到24的1x24矩陣
%利用reshape(A,m,n)將矩陣A以排列磁磚的方式排列成變化成m x n的陣列
%程式內容
clear all
A=linspace(1,24,24);
Q5_B=reshape(A,3,8)
Q5_C=reshape(A,6,4)
Q5_D=reshape(A,2,12)
執行結果:
Q1_D =
0 0 1 1 0 0 0 1 1 0
討論:
直接比較比起利用for迴圈一一比較較為快速,也可以利用find函數來找出其index
Q2_D_a =
0 0 1 0 1 1
Q2_D_b =
0 1 1 0 0 1
Q2_D_c =
-8 16 11 14 -11 23
討論:
直接對於element作比較以及運算
Q3_a =
31 64 96
Q3_b =
0.5000 1.0000 1.0000
Q3_b_1 =
0.9643
Q3_c =
80 640 1440
Q3_d =
-0.2939 -0.5967 -0.9487
Q3_e =
45.4649 98.9358 -80.4859
討論:
對於矩陣的element之間的運算要注意乘除之前的".",然而b小題有無卻出現兩種不同的答案
不過對於陣列運算注意維數外若是要element運算則程式寫法要注意
Q4_R_s =
640
Q4_R_p =
7.1006
討論:
sum函數可以直接求出陣列內每個元素的總和
Q5_B =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
Q5_C =
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
6 12 18 24
Q5_D =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
討論:
定義矩陣的方式可以直接A=(1:24)或是用linspace但是要注意的是要分成多少元素要寫出
reshape可以將陣列排列成想要的維度,但是要注意要和元素總量相同
張貼者:
Eric Wu
於
10/05/2006 04:41:00 下午
1 意見
標籤: 吳堉光
以前所提供之作業繳交方式仍然有效,將繼續計分直到期末。由於沒有期末考,故一切作業均在明年一月十二日午夜到期,逾期不收件,請同學注意。