之差的一半。通过绘制函数可对此进行验证。
x = -5:0.01:5;
y = sinh(x);
plot(x,y)
line([0,0],[-80,80], 'Color','r')
line([-5,5],[0,0], 'Color','r')
grid on
之差的一半。通过绘制函数可对此进行验证。
x = -5:0.01:5;
y = sinh(x);
plot(x,y)
line([0,0],[-80,80], 'Color','r')
line([-5,5],[0,0], 'Color','r')
grid on
邏輯操作元主要在連繫兩個邏輯值,應用上分為元素間、位元間等兩類。
其相關操作元如下表。
| 操作元 | 範例 | 說明 |
|---|---|---|
| & | C=A&B | AB兩元素均為1時為1,否則為0 |
| | | C=A|B | 任一A或B為1為正,否則為0 |
| ~ | C=~A | 非A,即A為0時為1,否則為0 |
| xor | C=xor(A,B) | 僅其中一個為非零時為1,否則為0 |
| 操作元 | 範例 | 說明 |
|---|---|---|
| any | C=any(A,dim) | A矩陣中之任何行向元素不為0時為1,否則為0。dim=2時為列向。 |
| all | C=all(A) | 矩陣中之任何行向元素均為1時為1,否則為0。dim=2時為列向。 |
| isprime | C=isprime(A) | A矩陣中,元素為質數時為1時為1,否則為0 |
| isequal | C= isequal(A) | 僅其中一個為非零時為1,否則為0 |
| isempty | C= isempty(A) | 若為空矩陣為1,否則為0 |
| isinteger | C= isinteger(A) | 若為整數為1,否則為0 |
| isnumeric | C= isnumeric(A) | 若為數值為1,否則為0 |
| isreal | C= isreal(A) | 若為實數為1,否則為0 |
| isfinite | C= isfinite(A) | 若為定值為1,否則為0 |
| logical | C= islogical(A) | 將矩陣A轉為邏輯值,非零為1 |
| islogical | C= islogical(A) | 若為邏輯值為1,否則為0 |
| ischar | C= ischar(A) | 若為文字值為1,否則為0 |
| iscell | C= iscell(A) | 若為細胞陣列為1,否則為0 |
| find | C=find(A);C=find(A>B) | 找尋矩陣A中不為零之序號,存於C找尋矩陣A大於B之序號存於C |
>> A=-5:5
A =
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> islogical(A)
ans =
0
>> logical(A)
Warning: Values other than 0 or 1 converted to logical 1.
ans =
1 1 1 1 1 0 1 1 1 1 1
此外,any與 all兩函數則是檢驗一個矩陣是否有非零元素或全為非零元素。>>any(A==B)
ans =
1 1 1
>>any(A==B,2)
ans =
0
1
1
>>all(A==B)
ans =
0 0 0
>>all(A==B, 2)
ans =
0
1
0
A=fix(rand(3)*10)
A =
9 8 8
9 0 0
4 3 1
>>find(A)'
ans =
1 2 3 4 6 7 9
>>find(A>5)'
ans =
1 2 4 7
源自於http://bime-matlab.blogspot.com/2006/10/31_09.html
兩陣列間之相互比較是常有的事,若能配合程式之關係運算則可節省撰寫時間。一般關係操作元主要在兩個變數間作邏輯性比較,,然後選擇一個最佳的結果;在MATLAB之應用上實也脫離不了這些原則。只是在陣列之比較上,必須時時注意其大小之匹配。下面為一般操作元之定義:
表3.1 關係操作元
操作單元符號 說明
< 小於
<= 小於或等於
> 大於
>= 大於或等於
== 等於
~= 不等於
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>>B=round(rand(4,4)*16)
B =
7 10 11 10
15 1 12 3
13 14 12 11
15 15 6 1
>>C= (A>=B)
C =
4×4 logical array
1 0 0 1
0 1 0 1
0 0 0 1
0 0 1 1
若在A矩陣中,將所有A>=B之元素均設為100,
>> A(C)=100
A =
100 2 3 100
5 100 10 100
9 7 6 100
4 14 100 100
A(A>=B)=100
A =
100 2 3 100
5 100 10 100
9 7 6 100
4 14 100 100
A矩陣中只要相對應於C矩陣中之值為真,或合於A>=B條件之元素
因而均被設為100。
這種方法並不只與其他矩陣比較,與自身矩陣之元素比較亦可,例如:
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(A<10)=10
A =
16 10 10 13
10 11 10 10
10 10 10 12
10 14 15 10
源自於http://bime-matlab.blogspot.com/2006/10/blog-post_09.html
複雜的程式則是採用主程式、副程式或函數檔間相互呼叫的方式,由各檔案專司解決特定的功能,如此形成一個程式之大架構。這些程式執行過程中,必須配合執行之中間值,進行比較、判斷,最後得到適當之結果。有些檔案可能需經過多次呼叫,才能達到程式預設之目的;有些則需判斷結果之適當性,依據最佳的決策選擇執行的路徑。
MATLAB Script:
使用技巧:
下面是一個matlab指令碼程式,可以執行一下,看看效果
for i = 1:10
x = linspace(0,10,101);
plot(x, sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'-.ps'));
endFlow Control:
matlab中有如下的控制語句
在控制語句中,還要配合一些邏輯操作,下面是相關的邏輯操作。
if elseif else語句:
% 語句格式
if condition1
statement1
elseif condition2
statement2
else
statement3
end
% 程式
a = 3;
if rem(a, 2) == 0 % rem()函式是求餘數
disp('a is even')
else
disp('a is odd')
end結構化程式的作用就是控制程式的執行順序,不會像之前說到的完全按從上到下的順序執行,會跳過某條語句執行。
switch語句:
% 語句格式
switch expression
case value1
statement1
case value2
statement2
.
.
otherwise
statement
end
% 程式
input_num = 1;
switch input_num
case -1
disp('negative 1');
case 0
disp('zero');
case 1
disp('positive 1');
otherwise
disp('other value');
endwhile語句:
% 語句格式
while expression
statement
end
% 程式
n = 1;
while prod(1:n) < 1e100 % 1-n的元素相乘
n = n + 1;
endfor語句:
% 語句格式
for variable=start:increment:ends
commands
end
% 程式
for n=1:10
a(n) = 2^n;
end
disp(a)預先定義變數空間:提升效率.
A = zeros(2000, 2000);在往這個矩陣中新增值。右邊的更快。
break語句; 用在迴圈語句中,用來終止迴圈。
結構化程式的技巧:
Built-in Functions:
matlab的自己函式,是已經定義好的函式,可以直接呼叫去使用。
edit(which('mean.m')):開啟自建函式mean.m檔案
關鍵字:function
函式名和檔名要相匹配
目錄:matlab需要找到這個函式
輸入和輸出變數是可選的
本地變數:dim和flag不是被接受的
User Define Functions:
我們自己定義函式,完成我們所需要的功能。
% 自由落體函式
function y = freebody(x0, v0, t)
x = x0 + v0 .* t + 1/2*9.8*t.*t;呼叫函式:freebody(0,0,10)
注意:.* 是元素之間也可以相乘
函式具有多個輸入和輸出:
一元二次方程作圖問題
a=1;
b=-2;
c=1;
syms x
solve(a*x^2+b*x+c)
func=@(x)(a*x^2+b*x+c);%自定義函數
fplot(func,[-10,10]) %繪制二維圖形
xlabel('x'),ylabel('y(x)') %坐標軸的名稱標記
源自於http://bime-matlab.blogspot.com/2006/10/blog-post.html
矩陣為一組二維向量之實數或複數之陣列,其加減乘除之運算與一般的數學運算法略有不同,陣列通常以行向量為主,但一般運算仍可混用。即使如此,在線性代數中所定義的矩陣操作大體上
Matlab均能支援。其中諸如一般運算、線性方程、特徵值及單一值與階乘運算等均包括在內。
由於陣列所代表的是一堆有系統的數字,與另一個陣列相運算時,必須依據不同的規則才能獲得
================================
操作名稱 應用情形
---------------------------------
C= A◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、左除(\)、右除(/)
C= A.◎B-- ◎處可為乘法(*)、乘幂(^)、左除(\)、右除(/)
C= A◎c-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、右除(/)
C= c◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、左除(\)、右除(./)
由表中可知,一個操作元前有一點與沒有一點其意義是不同的。
C= A.◎B C= A◎B
在操作元前加一點表示是項目與項目間之操作,即為所謂之對映運算方式,此時兩矩陣之大小要相同。這與一般矩陣之加法及減法相同,其運算僅針對元素間之運算。偏置功能則僅適用於矩陣間,不適用於項目間之操作。這些操作元亦可應用於矩陣與一般常數,後者之大小為[1x1]。
設C、D分別為3x3之方矩陣,且設C為魔術方塊,D為[1 2 3;4 5 6;7 8 9],即:
>> C=magic(3)
C =
8 1 6
3 5 7
4 9 2
>> D=[1 2 3;4 5 6;7 8 9]
D =
1 2 3
4 5 6
7 8 9
>> C+D
ans =
9 3 9
7 10 13
11 17 11
>> C-D
ans =
7 -1 3
-1 0 1
-3 1 -7
>> C*D
ans =
54 69 84
72 87 102
54 69 84
>> C/D
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
1.652118e-18.
ans =
1.0e+16 *
3.7830 -7.5660 3.7830
0.0000 0.0000 -0.0000
-3.7830 7.5660 -3.7830
>> C\D
ans =
0.0167 0.0833 0.1500
0.7667 0.8333 0.9000
0.0167 0.0833 0.1500
C.*D與C*D兩種之運算結果,前者為對應元素相乘;後者為兩個矩陣進行數學相乘:
C =
8 1 6
3 5 7
4 9 2
>>C.*D %對應元素相乘
ans =
8 2 18
12 25 42
28 72 18
>>C*D %矩陣乘法
ans =
54 69 84
72 87 102
54 69 84例如有一化妝品系列,均由三種原料調配而成,因原料之分量會產生不同產品系列。今設有四種產品,其基本原料分別如有下份量:
>>A=[ 2 4 3; 5 2 1; 7 3 5; 4 5 6]A =2 4 3 %產品1之成分
5 2 1 %產品2之成分
7 3 5 %產品3之成分
4 5 6 %產品4之成分此時矩陣A代表四種產品(四列)之三種成份量。現設三種成分均有不同的價格,其價格設以一行向量表示,即:>>P=[120 50 100]'
P =
120
50
100矩陣之第一列,其成本只要將A(1,:)與P相乘,即A(1,:)*P,其結果為:>>A(1,:)*P亦即代表產品1的成本,若直接計算應為
ans = 7402 x (120) + 4x(50) +3x(100) = 740結果與上面之A(1,:)*P相同。故上面四種產品,若以成分矩陣A與價格矩陣P,即可得四種產品之成本:>>A*P
ans =
740
800
1490
1330A之大小為(4x3),P之大小為(3x1),得到的結果為(3x1)。換言之,兩矩陣相乘,第一矩陣之行與第二矩陣之列,其大小應一致。而結果之大小應為第一矩陣之列與第二矩陣之行,或(4x3)(3x1)=(4x1)。以通式表示之:A[m,n] * B[n,p] = C[m,p]>>D*C
ans =
26 38 26
71 83 71
116 128 116
足見D*C與C*D的結果並不同。但只要矩陣之大小相搭配,其分解及分配之特性則仍然存在,如:A*(B+C)=A*B + A*C或(A*B)*C=A*(B*C)若用eye(3)函數產生單位矩陣,則其無論先乘與後乘,結果都會一樣。>>I=eye(3)結論是若I為單位矩陣,則I*A=A*I=A,顯示交換律在此情形下仍可成立。
I =
1 0 0
0 1 0
0 0 1
>>AA*I
ans =
8 1 6
3 5 7
4 9 2
>>I*AA
ans =
8 1 6
3 5 7
4 9 2陣列之除法
陣列除法屬逐元除法,因此兩陣列相除時必須同樣大小。例如:>> a=[2 3 4]a = 2 3 4>> b=[5 6 7]b = 5 6 7>> a/bans = 0.5091>> a./bans = 0.4000 0.5000 0.5714>> c=[1 2;3 4]這是兩陣列經過右除(./)運算之結果
c =
1 2
3 4
>> d=[3 5; 8 7]
d =
3 5
8 7
>> c./d
ans =
0.3333 0.4000
0.3750 0.5714陣列之次方陣列之逐元運算亦可應用於次方,但其次方數必須為常數,以pascal函數產生之對稱矩陣為例:>> A=pascal(3)
A =
1 1 1
1 2 3
1 3 6
>> A.^3
ans =
1 1 1
1 8 27
1 27 216
MQTT 協定與 Modbus 通訊的遠端監控與控制系統架構 這張圖片展示了一個 結合 MQTT 協定與 Modbus 通訊的遠端監控與控制系統架構 (主要透過 Node-RED 進行資料整合)。 系統包含三個核心部分,其運作功能說明如下: 1. ESP32 終端設備(硬體控制層...