-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path29565.html
953 lines (804 loc) · 191 KB
/
29565.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>MATLAB快速入门(五) | magic-H</title><meta name="keywords" content="MATLAB"><meta name="author" content="magic-H"><meta name="copyright" content="magic-H"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="一.简介 本篇参考官方入门文档编写 前提准备: MATLAB 二. 快速入门(五)(线性代数)1. MATLAB 环境中的矩阵本主题介绍如何在 MATLAB® 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度均">
<meta property="og:type" content="article">
<meta property="og:title" content="MATLAB快速入门(五)">
<meta property="og:url" content="https://magic-h.top/29565.html">
<meta property="og:site_name" content="magic-H">
<meta property="og:description" content="一.简介 本篇参考官方入门文档编写 前提准备: MATLAB 二. 快速入门(五)(线性代数)1. MATLAB 环境中的矩阵本主题介绍如何在 MATLAB® 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度均">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg">
<meta property="article:published_time" content="2022-07-23T00:00:00.000Z">
<meta property="article:modified_time" content="2023-06-09T02:57:26.202Z">
<meta property="article:author" content="magic-H">
<meta property="article:tag" content="MATLAB">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg"><link rel="shortcut icon" href="/img/favicon.ico"><link rel="canonical" href="https://magic-h.top/29565"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//sdk.51.la"/><link rel="preconnect" href="//fonts.googleapis.com" crossorigin=""/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.css" media="print" onload="this.media='all'"><script>!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"Jl7ITgjGBeVbLmqO",ck:"Jl7ITgjGBeVbLmqO"});
</script><script>!(function(c,i,e,b){
var h=i.createElement("script");
var f=i.getElementsByTagName("script")[0];
h.type="text/javascript";
h.crossorigin=true;
h.onload=function(){new c[b]["Monitor"]().init({id:"Jl7IrsA7TWlXlR99"});};
f.parentNode.insertBefore(h,f);h.src=e;})(window,document,"https://sdk.51.la/perf/js-sdk-perf.min.js","LingQue");</script><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Titillium+Web&display=swap" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"search.xml","languages":{"hits_empty":"找不到您查询的内容:${query}"}},
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '天',
date_suffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'mediumZoom',
Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"bottom-left"},
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'MATLAB快速入门(五)',
isPost: true,
isHome: false,
isHighlightShrink: false,
isToc: true,
postUpdate: '2023-06-09 02:57:26'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><link rel="stylesheet" href="/css/mycss.css"><script src="/js/sakura.js"></script><script src="/js/snow2.js"></script><meta name="generator" content="Hexo 6.1.0"><link rel="alternate" href="/atom.xml" title="magic-H" type="application/atom+xml">
</head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://s4.ax1x.com/2022/02/18/HT4dgI.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><div class="data-item"><a href="/archives/"><div class="headline">文章</div><div class="length-num">21</div></a></div><div class="data-item"><a href="/tags/"><div class="headline">标签</div><div class="length-num">9</div></a></div><div class="data-item"><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/%E7%9B%B8%E5%86%8C/"><i class="fa-fw fa fa-video"></i><span> 相册</span></a></div><div class="menus_item"><a class="site-page" href="/questions/"><i class="fa-fw fa fa-video"></i><span> 答疑</span></a></div><div class="menus_item"><a class="site-page" href="/artitalk/"><i class="fa-fw fa fa-home"></i><span> 说说</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间线</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg" id="page-header" style="background-image: url('https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207182124785.png')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">magic-H</a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/%E7%9B%B8%E5%86%8C/"><i class="fa-fw fa fa-video"></i><span> 相册</span></a></div><div class="menus_item"><a class="site-page" href="/questions/"><i class="fa-fw fa fa-video"></i><span> 答疑</span></a></div><div class="menus_item"><a class="site-page" href="/artitalk/"><i class="fa-fw fa fa-home"></i><span> 说说</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间线</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">MATLAB快速入门(五)</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2022-07-23T00:00:00.000Z" title="发表于 2022-07-23 00:00:00">2022-07-23</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2023-06-09T02:57:26.202Z" title="更新于 2023-06-09 02:57:26">2023-06-09</time></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">12k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>44分钟</span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><h1 id="一-简介"><a href="#一-简介" class="headerlink" title="一.简介"></a><code>一.简介</code></h1><p> <strong>本篇参考官方入门文档编写</strong></p>
<p> <strong>前提准备:</strong></p>
<ol>
<li>MATLAB</li>
</ol>
<hr>
<h1 id="二-快速入门(五)(线性代数)"><a href="#二-快速入门(五)(线性代数)" class="headerlink" title="二. 快速入门(五)(线性代数)"></a><code>二. 快速入门(五)(线性代数)</code></h1><h3 id="1-MATLAB-环境中的矩阵"><a href="#1-MATLAB-环境中的矩阵" class="headerlink" title="1. MATLAB 环境中的矩阵"></a>1. MATLAB 环境中的矩阵</h3><p>本主题介绍如何在 MATLAB® 中创建矩阵和执行基本矩阵计算。</p>
<p>MATLAB 环境使用<em>矩阵</em>来表示包含以二维网格排列的实数或复数的变量。更广泛而言,<em>数组</em>为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度均相同。矩阵中定义的数学运算是线性代数的主题。</p>
<h4 id="创建矩阵"><a href="#创建矩阵" class="headerlink" title="创建矩阵"></a>创建矩阵</h4><p>MATLAB 提供了许多函数,用于创建各种类型的矩阵。例如,您可以使用基于帕斯卡三角形的项创建一个对称矩阵:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">3</span>)</span><br><span class="line">A =</span><br><span class="line"> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span></span><br><span class="line"> <span class="number">1</span> <span class="number">3</span> <span class="number">6</span></span><br></pre></td></tr></table></figure>
<p>您也可以创建一个非对称<em>幻方矩阵</em>,它的行总和与列总和相等:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">B = <span class="built_in">magic</span>(<span class="number">3</span>)</span><br><span class="line">B =</span><br><span class="line"> <span class="number">8</span> <span class="number">1</span> <span class="number">6</span></span><br><span class="line"> <span class="number">3</span> <span class="number">5</span> <span class="number">7</span></span><br><span class="line"> <span class="number">4</span> <span class="number">9</span> <span class="number">2</span></span><br></pre></td></tr></table></figure>
<p>另一个示例是由随机整数构成的 3×2 矩形矩阵:在这种情况下,<code>randi</code> 的第一个输入描述整数可能值的范围,后面两个输入描述行和列的数量。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">C = randi(<span class="number">10</span>,<span class="number">3</span>,<span class="number">2</span>)</span><br><span class="line">C =</span><br><span class="line"></span><br><span class="line"> <span class="number">9</span> <span class="number">10</span></span><br><span class="line"> <span class="number">10</span> <span class="number">7</span></span><br><span class="line"> <span class="number">2</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>列向量为 m×1 矩阵,行向量为 1×n 矩阵,标量为 1×1 矩阵。要手动定义矩阵,请使用方括号 <code>[ ]</code> 来表示数组的开始和结束。在括号内,使用分号 <code>;</code> 表示行的结尾。在标量(1×1 矩阵)的情况下,括号不是必需的。例如,以下语句生成一个列向量、一个行向量和一个标量:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">u = [<span class="number">3</span>; <span class="number">1</span>; <span class="number">4</span>]</span><br><span class="line"></span><br><span class="line">v = [<span class="number">2</span> <span class="number">0</span> <span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line">s = <span class="number">7</span></span><br><span class="line">u =</span><br><span class="line"> <span class="number">3</span></span><br><span class="line"> <span class="number">1</span></span><br><span class="line"> <span class="number">4</span></span><br><span class="line"></span><br><span class="line">v =</span><br><span class="line"> <span class="number">2</span> <span class="number">0</span> <span class="number">-1</span></span><br><span class="line"></span><br><span class="line">s =</span><br><span class="line"> <span class="number">7</span></span><br></pre></td></tr></table></figure>
<p>有关创建和处理矩阵的详细信息,请参阅<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/math/creating-and-concatenating-matrices.html">创建、串联和扩展矩阵</a>。</p>
<h4 id="矩阵的加法和减法"><a href="#矩阵的加法和减法" class="headerlink" title="矩阵的加法和减法"></a>矩阵的加法和减法</h4><p>矩阵和数组的加减法是逐个元素执行的,或者说是<em>按元素</em>执行的。例如,<code>A</code> 加 <code>B</code> 之后再减去 <code>A</code> 又可以得到 <code>B</code>:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">X = A + B</span><br><span class="line">X =</span><br><span class="line"> <span class="number">9</span> <span class="number">2</span> <span class="number">7</span></span><br><span class="line"> <span class="number">4</span> <span class="number">7</span> <span class="number">10</span></span><br><span class="line"> <span class="number">5</span> <span class="number">12</span> <span class="number">8</span></span><br><span class="line">Y = X - A</span><br><span class="line">Y =</span><br><span class="line"> <span class="number">8</span> <span class="number">1</span> <span class="number">6</span></span><br><span class="line"> <span class="number">3</span> <span class="number">5</span> <span class="number">7</span></span><br><span class="line"> <span class="number">4</span> <span class="number">9</span> <span class="number">2</span></span><br></pre></td></tr></table></figure>
<p>加法和减法要求两个矩阵具有兼容的维度。如果维度不兼容,将会导致错误:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">X = A + C</span><br><span class="line">Error using + </span><br><span class="line">Matrix dimensions must agree.</span><br></pre></td></tr></table></figure>
<p>有关详细信息,请参阅<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/matlab_prog/array-vs-matrix-operations.html">数组与矩阵运算</a>。</p>
<h4 id="向量乘积和转置"><a href="#向量乘积和转置" class="headerlink" title="向量乘积和转置"></a>向量乘积和转置</h4><p>长度相同的行向量和列向量可以按任一顺序相乘。其结果是一个标量(称为<em>内积</em>)或一个矩阵(称为<em>外积</em>):</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">u = [<span class="number">3</span>; <span class="number">1</span>; <span class="number">4</span>];</span><br><span class="line">v = [<span class="number">2</span> <span class="number">0</span> <span class="number">-1</span>];</span><br><span class="line">x = v*u</span><br><span class="line">x =</span><br><span class="line"></span><br><span class="line"> <span class="number">2</span></span><br><span class="line">X = u*v</span><br><span class="line">X =</span><br><span class="line"></span><br><span class="line"> <span class="number">6</span> <span class="number">0</span> <span class="number">-3</span></span><br><span class="line"> <span class="number">2</span> <span class="number">0</span> <span class="number">-1</span></span><br><span class="line"> <span class="number">8</span> <span class="number">0</span> <span class="number">-4</span></span><br></pre></td></tr></table></figure>
<p>对于实矩阵,<em>转置</em>运算对 aij 和 aji 进行交换。对于复矩阵,还要考虑是否用数组中复数项的复共轭来形成<em>复共轭转置</em>。MATLAB 使用撇号运算符 (<code>'</code>) 执行复共轭转置,使用点撇号运算符 (<code>.'</code>) 执行无共轭的转置。对于包含所有实数元素的矩阵,这两个运算符返回相同结果。</p>
<p>示例矩阵 <code>A = pascal(3)</code> 是<em>对称的</em>,因此 <code>A'</code> 等于 <code>A</code>。然而,<code>B = magic(3)</code> 不是对称的,因此 <code>B'</code> 的元素是 B 的元素沿主对角线反转之后的结果:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">B = <span class="built_in">magic</span>(<span class="number">3</span>)</span><br><span class="line">B =</span><br><span class="line"></span><br><span class="line"> <span class="number">8</span> <span class="number">1</span> <span class="number">6</span></span><br><span class="line"> <span class="number">3</span> <span class="number">5</span> <span class="number">7</span></span><br><span class="line"> <span class="number">4</span> <span class="number">9</span> <span class="number">2</span></span><br><span class="line">X = B'</span><br><span class="line">X =</span><br><span class="line"></span><br><span class="line"> <span class="number">8</span> <span class="number">3</span> <span class="number">4</span></span><br><span class="line"> <span class="number">1</span> <span class="number">5</span> <span class="number">9</span></span><br><span class="line"> <span class="number">6</span> <span class="number">7</span> <span class="number">2</span></span><br></pre></td></tr></table></figure>
<p>对于向量,转置会将行向量变为列向量(反之亦然):</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">x = v'</span><br><span class="line"></span><br><span class="line">x =</span><br><span class="line"> <span class="number">2</span></span><br><span class="line"> <span class="number">0</span></span><br><span class="line"> <span class="number">-1</span></span><br></pre></td></tr></table></figure>
<p>如果 <code>x</code> 和 <code>y</code> 均为实数列向量,则乘积 <code>x*y</code> 不确定,但以下两个乘积</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">x'*y</span><br></pre></td></tr></table></figure>
<p>和</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">y'*x</span><br></pre></td></tr></table></figure>
<p>产生相同的标量结果。此参数使用很频繁,它有三个不同的名称<em>内</em>积、<em>标量</em>积或<em>点</em>积。甚至还有一个专门的点积函数,称为 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/dot.html"><code>dot</code></a>。</p>
<p>对于复数向量或矩阵 <code>z</code>,参量 <code>z'</code> 不仅可转置该向量或矩阵,而且可将每个复数元素转换为其复共轭数。也就是说,每个复数元素的虚部的正负号将会发生更改。以如下复矩阵为例:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">z = [<span class="number">1</span>+<span class="number">2</span><span class="built_in">i</span> <span class="number">7</span><span class="number">-3</span><span class="built_in">i</span> <span class="number">3</span>+<span class="number">4</span><span class="built_in">i</span>; <span class="number">6</span><span class="number">-2</span><span class="built_in">i</span> <span class="number">9</span><span class="built_in">i</span> <span class="number">4</span>+<span class="number">7</span><span class="built_in">i</span>]</span><br><span class="line">z =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> + <span class="number">2.0000</span><span class="built_in">i</span> <span class="number">7.0000</span> - <span class="number">3.0000</span><span class="built_in">i</span> <span class="number">3.0000</span> + <span class="number">4.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">6.0000</span> - <span class="number">2.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">9.0000</span><span class="built_in">i</span> <span class="number">4.0000</span> + <span class="number">7.0000</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<p><code>z</code> 的复共轭转置为:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">z'</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> - <span class="number">2.0000</span><span class="built_in">i</span> <span class="number">6.0000</span> + <span class="number">2.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">7.0000</span> + <span class="number">3.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> - <span class="number">9.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">3.0000</span> - <span class="number">4.0000</span><span class="built_in">i</span> <span class="number">4.0000</span> - <span class="number">7.0000</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<p>非共轭复数转置(其中每个元素的复数部分保留其符号)表示为 <code>z.'</code>:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">z.'</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> + <span class="number">2.0000</span><span class="built_in">i</span> <span class="number">6.0000</span> - <span class="number">2.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">7.0000</span> - <span class="number">3.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">9.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">3.0000</span> + <span class="number">4.0000</span><span class="built_in">i</span> <span class="number">4.0000</span> + <span class="number">7.0000</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<p>对于复数向量,两个标量积 <code>x'*y</code> 和 <code>y'*x</code> 互为复共轭数,而复数向量与其自身的标量积 <code>x'*x</code> 为实数。</p>
<h4 id="矩阵乘法"><a href="#矩阵乘法" class="headerlink" title="矩阵乘法"></a>矩阵乘法</h4><p>矩阵乘法是以这样一种方式定义的:反映底层线性变换的构成,并允许紧凑表示联立线性方程组。如果 A 的列维度等于 B 的行维度,或者其中一个矩阵为标量,则可定义矩阵乘积 C = AB。如果 A 为 m×p 且 B 为 p×n,则二者的乘积 C 为 m×n。该乘积实际上可以使用 MATLAB <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/for.html"><code>for</code></a> 循环、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/colon.html"><code>colon</code></a> 表示法和向量点积进行定义:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">3</span>);</span><br><span class="line">B = <span class="built_in">magic</span>(<span class="number">3</span>);</span><br><span class="line">m = <span class="number">3</span>; </span><br><span class="line">n = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">for</span> <span class="built_in">i</span> = <span class="number">1</span>:m</span><br><span class="line"> <span class="keyword">for</span> <span class="built_in">j</span> = <span class="number">1</span>:n</span><br><span class="line"> C(<span class="built_in">i</span>,<span class="built_in">j</span>) = A(<span class="built_in">i</span>,:)*B(:,<span class="built_in">j</span>);</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>MATLAB 使用星号表示矩阵乘法,如 <code>C = A*B</code> 中所示。矩阵乘法不适用交换律;即 <code>A*B</code> 通常不等于 <code>B*A</code>:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">X = A*B</span><br><span class="line">X =</span><br><span class="line"> <span class="number">15</span> <span class="number">15</span> <span class="number">15</span></span><br><span class="line"> <span class="number">26</span> <span class="number">38</span> <span class="number">26</span></span><br><span class="line"> <span class="number">41</span> <span class="number">70</span> <span class="number">39</span></span><br><span class="line">Y = B*A</span><br><span class="line">Y =</span><br><span class="line"> <span class="number">15</span> <span class="number">28</span> <span class="number">47</span></span><br><span class="line"> <span class="number">15</span> <span class="number">34</span> <span class="number">60</span></span><br><span class="line"> <span class="number">15</span> <span class="number">28</span> <span class="number">43</span></span><br></pre></td></tr></table></figure>
<p>矩阵可以在右侧乘以列向量,在左侧乘以行向量:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">u = [<span class="number">3</span>; <span class="number">1</span>; <span class="number">4</span>];</span><br><span class="line">x = A*u</span><br><span class="line">x =</span><br><span class="line"></span><br><span class="line"> <span class="number">8</span></span><br><span class="line"> <span class="number">17</span></span><br><span class="line"> <span class="number">30</span></span><br><span class="line">v = [<span class="number">2</span> <span class="number">0</span> <span class="number">-1</span>];</span><br><span class="line">y = v*B</span><br><span class="line">y =</span><br><span class="line"></span><br><span class="line"> <span class="number">12</span> <span class="number">-7</span> <span class="number">10</span></span><br></pre></td></tr></table></figure>
<p>矩形矩阵乘法必须满足维度兼容性条件:由于 <code>A</code> 是 3×3 矩阵,<code>C</code> 是 3×2 矩阵,因此可将二者相乘得到 3×2 结果(共同的内部维度会消去):</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">X = A*C</span><br><span class="line">X =</span><br><span class="line"></span><br><span class="line"> <span class="number">24</span> <span class="number">17</span></span><br><span class="line"> <span class="number">47</span> <span class="number">42</span></span><br><span class="line"> <span class="number">79</span> <span class="number">77</span></span><br></pre></td></tr></table></figure>
<p>但是,乘法不能以相反的顺序执行:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Y = C*A</span><br><span class="line">Error using * </span><br><span class="line">Incorrect dimensions <span class="keyword">for</span> matrix multiplication. Check that the number of columns </span><br><span class="line">in the first matrix matches the number of rows in the second matrix. To perform </span><br><span class="line">elementwise multiplication, use <span class="string">'.*'</span>.</span><br></pre></td></tr></table></figure>
<p>您可以将任何内容与标量相乘:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">s = <span class="number">10</span>;</span><br><span class="line">w = s*y</span><br><span class="line">w =</span><br><span class="line"></span><br><span class="line"> <span class="number">120</span> <span class="number">-70</span> <span class="number">100</span></span><br></pre></td></tr></table></figure>
<p>当您将数组与标量相乘时,标量将隐式扩展为与另一输入相同的大小。这通常称为<em>标量扩展</em>。</p>
<h4 id="单位矩阵"><a href="#单位矩阵" class="headerlink" title="单位矩阵"></a>单位矩阵</h4><p>普遍接受的数学表示法使用大写字母 I 来表示单位矩阵,即主对角线元素为 1 且其他位置元素为 0 的各种大小的矩阵。这些矩阵具有以下属性:无论维度是否兼容,AI = A 和 IA = A。</p>
<p>原始版本的 MATLAB 不能将 I 用于此用途,因为它不会区分大小字母和小写字母,并且 i 已用作下标和复数单位。因此,引入了英语双关语。函数</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">eye</span>(m,n)</span><br></pre></td></tr></table></figure>
<p>返回 m×n 矩形单位矩阵,<code>eye(n)</code> 返回 n×n 单位方阵。</p>
<h4 id="矩阵求逆"><a href="#矩阵求逆" class="headerlink" title="矩阵求逆"></a>矩阵求逆</h4><p>如果矩阵 <code>A</code> 为非奇异方阵(非零行列式),则方程 AX = I 和 XA = I 具有相同的解 X。此解称为 <code>A</code> 的<em>逆矩阵</em>,表示为 A-1。<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/inv.html"><code>inv</code></a> 函数和表达式 <code>A^-1</code> 均可对矩阵求逆。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">3</span>)</span><br><span class="line">A =</span><br><span class="line"> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span></span><br><span class="line"> <span class="number">1</span> <span class="number">3</span> <span class="number">6</span></span><br><span class="line">X = inv(A)</span><br><span class="line">X =</span><br><span class="line"></span><br><span class="line"> <span class="number">3.0000</span> <span class="number">-3.0000</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">-3.0000</span> <span class="number">5.0000</span> <span class="number">-2.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">-2.0000</span> <span class="number">1.0000</span></span><br><span class="line">A*X</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0.0000</span> <span class="number">1.0000</span> <span class="number">-0.0000</span></span><br><span class="line"> <span class="number">-0.0000</span> <span class="number">0.0000</span> <span class="number">1.0000</span></span><br></pre></td></tr></table></figure>
<p>通过 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/det.html"><code>det</code></a> 计算的<em>行列式</em>表示由矩阵描述的线性变换的缩放因子。当行列式正好为零时,矩阵为<em>奇异矩阵</em>,因此不存在逆矩阵。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">d = det(A)</span><br><span class="line">d =</span><br><span class="line"></span><br><span class="line"> <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>有些矩阵<em>接近奇异矩阵</em>,虽然存在逆矩阵,但计算容易出现数值误差。<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/cond.html"><code>cond</code></a> 函数计算<em>逆运算的条件数</em>,它指示矩阵求逆结果的精度。条件数的范围是从 <code>1</code>(数值稳定的矩阵)到 <code>Inf</code>(奇异矩阵)。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">c = cond(A)</span><br><span class="line">c =</span><br><span class="line"></span><br><span class="line"> <span class="number">61.9839</span></span><br></pre></td></tr></table></figure>
<p>很少需要为某个矩阵构造显式逆矩阵。当解算线性方程组 Ax = b 时,往往会错误使用 <code>inv</code>。从执行时间和数值精度方面而言,求解此方程的最佳方法是使用矩阵反斜杠运算符,即 <code>x = A\b</code>。有关详细信息,请参阅 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a>。</p>
<h4 id="Kronecker-张量积"><a href="#Kronecker-张量积" class="headerlink" title="Kronecker 张量积"></a>Kronecker 张量积</h4><p>两个矩阵的 Kronecker 乘积 <code>kron(X,Y)</code> 为 <code>X</code> 的元素与 <code>Y</code> 的元素的所有可能乘积构成的较大矩阵。如果 <code>X</code> 为 m×n 且 <code>Y</code> 为 p×q,则 <code>kron(X,Y)</code> 为 mp×nq。元素以特定方式排列,呈现 <code>X</code> 的每个元素分别与整个矩阵 <code>Y</code> 相乘的结果。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[X(<span class="number">1</span>,<span class="number">1</span>)*Y X(<span class="number">1</span>,<span class="number">2</span>)*Y . . . X(<span class="number">1</span>,n)*Y</span><br><span class="line"> . . .</span><br><span class="line"> X(m,<span class="number">1</span>)*Y X(m,<span class="number">2</span>)*Y . . . X(m,n)*Y]</span><br></pre></td></tr></table></figure>
<p>Kronecker 乘积通常与元素为 0 和 1 的矩阵配合使用,以构建小型矩阵的重复副本。例如,如果 <code>X</code> 为 2×2 矩阵</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">X = [<span class="number">1</span> <span class="number">2</span></span><br><span class="line"> <span class="number">3</span> <span class="number">4</span>]</span><br></pre></td></tr></table></figure>
<p>且 <code>I = eye(2,2)</code> 为 2×2 单位矩阵,则:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">kron(X,I)</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1</span> <span class="number">0</span> <span class="number">2</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">1</span> <span class="number">0</span> <span class="number">2</span></span><br><span class="line"> <span class="number">3</span> <span class="number">0</span> <span class="number">4</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">3</span> <span class="number">0</span> <span class="number">4</span></span><br></pre></td></tr></table></figure>
<p>并且</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">kron(I,X)</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1</span> <span class="number">2</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"> <span class="number">3</span> <span class="number">4</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">1</span> <span class="number">2</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">3</span> <span class="number">4</span></span><br></pre></td></tr></table></figure>
<p>除了 <code>kron</code> 之外,对复制数组有用的其他函数还有 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/repmat.html"><code>repmat</code></a>、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/repelem.html"><code>repelem</code></a> 和 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/blkdiag.html"><code>blkdiag</code></a>。</p>
<h4 id="向量范数和矩阵范数"><a href="#向量范数和矩阵范数" class="headerlink" title="向量范数和矩阵范数"></a>向量范数和矩阵范数</h4><p>向量 x 的 p-范数,</p>
<p>‖<em>x</em>‖<em>p</em>=(∑∣∣<em>x**i</em>∣∣<em>p</em>)1/<em>p</em> ,</p>
<p>使用 <code>norm(x,p)</code> 进行计算。此运算是为 p > 1 的任意值定义的,但最常见的 p 值为 1、2 和 ∞。默认值为 p = 2,这与<em>欧几里德长度</em>或<em>向量幅值</em>对应:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">v = [<span class="number">2</span> <span class="number">0</span> <span class="number">-1</span>];</span><br><span class="line">[norm(v,<span class="number">1</span>) norm(v) norm(v,<span class="built_in">inf</span>)]</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">3.0000</span> <span class="number">2.2361</span> <span class="number">2.0000</span></span><br></pre></td></tr></table></figure>
<p>矩阵 A 的 p-范数,</p>
<p>‖<em>A</em>‖<em>p</em>=max<em>x</em>‖<em>A**x</em>‖<em>p</em>‖<em>x</em>‖<em>p</em>,</p>
<p>可以针对 p = 1、2 和 ∞ 通过 <code>norm(A,p)</code> 进行计算。同样,默认值也为 p = 2:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">3</span>);</span><br><span class="line">[norm(A,<span class="number">1</span>) norm(A) norm(A,<span class="built_in">inf</span>)]</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">10.0000</span> <span class="number">7.8730</span> <span class="number">10.0000</span></span><br></pre></td></tr></table></figure>
<p>如果要计算矩阵的每行或每列的范数,可以使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/vecnorm.html"><code>vecnorm</code></a>:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vecnorm(A)</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.7321</span> <span class="number">3.7417</span> <span class="number">6.7823</span></span><br></pre></td></tr></table></figure>
<h4 id="使用线性代数方程函数的多线程计算"><a href="#使用线性代数方程函数的多线程计算" class="headerlink" title="使用线性代数方程函数的多线程计算"></a>使用线性代数方程函数的多线程计算</h4><p>对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:</p>
<ol>
<li>函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。</li>
<li>数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。</li>
<li>运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。</li>
</ol>
<p>对于大型双精度数组(约 10,000 个元素),矩阵乘法 <code>(X*Y)</code> 和矩阵乘幂 <code>(X^p)</code> 运算符会大幅增加速度。矩阵分析函数 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/det.html"><code>det</code></a>、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/rcond.html"><code>rcond</code></a>、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/hess.html"><code>hess</code></a> 和 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/expm.html"><code>expm</code></a> 也会对大型双精度数组大幅增加速度。</p>
<h4 id="相关主题"><a href="#相关主题" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-983672">线性方程组</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2418">分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2852">特征值</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-960721">奇异值</a></li>
</ul>
<h3 id="2-线性方程组"><a href="#2-线性方程组" class="headerlink" title="2. 线性方程组"></a>2. 线性方程组</h3><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-965550">计算注意事项</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-969653">通解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-960137">方阵方程组</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2064">超定方程组</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#bt7ov7u">欠定方程组</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#mw_31995d45-217c-4e69-9bcc-95642d2b676c">多右端线性方程组的求解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#brzoiix">迭代法</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#brs0ft8-1">多线程计算</a></li>
</ul>
<h4 id="计算注意事项"><a href="#计算注意事项" class="headerlink" title="计算注意事项"></a>计算注意事项</h4><p>进行科学计算时,最重要的一个问题是对联立线性方程组求解。</p>
<p>在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax = b 或 xA = b?</p>
<p>考虑 1×1 示例具有指导意义。例如,方程</p>
<p>7x = 21</p>
<p>是否具有唯一解?</p>
<p>答案当然是肯定的。方程有唯一解 x = 3。通过除法很容易求得该解:</p>
<p>x = 21/7 = 3。</p>
<p>该解通常<em>不是</em>通过计算 7 的倒数求得的,即先计算 7–1 = 0.142857…,然后将 7–1 乘以 21。这将需要更多的工作,而且如果 7–1 以有限位数表示时,准确性会较低。类似注意事项也适用于多个未知数的线性方程组;MATLAB 在解此类方程时不会计算矩阵的逆。</p>
<p>尽管这不是标准的数学表示法,但 MATLAB 使用标量示例中常见的除法术语来描述常规联立方程组的解。<em>斜杠</em> / 和<em>反斜杠</em> \ 这两个除号分别对应 MATLAB 函数 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mrdivide.html"><code>mrdivide</code></a> 和 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a>。两种运算符分别用于未知矩阵出现在系数矩阵左侧或右侧的情况:</p>
<table>
<thead>
<tr>
<th><code>x = b/A</code></th>
<th>表示使用 <code>mrdivide</code> 获得的矩阵方程 xA = b 的解。</th>
</tr>
</thead>
<tbody><tr>
<td><code>x = A\b</code></td>
<td>表示使用 <code>mldivide</code> 获得的矩阵方程 Ax = b 的解。</td>
</tr>
</tbody></table>
<p>考虑将方程 Ax = b 或 xA = b 的两端“除以”A。系数矩阵 <code>A</code> 始终位于“分母”中。</p>
<p><code>x = A\b</code> 的维度兼容性条件要求两个矩阵 <code>A</code> 和 <code>b</code> 的行数相同。这样,解 <code>x</code> 的列数便与 <code>b</code> 的列数相同,并且其行维度等于 <code>A</code> 的列维度。对于 <code>x = b/A</code>,行和列的角色将会互换。</p>
<p>实际上,Ax=b 形式的线性方程组比 xA=b 形式的线性方程组更常见。因此,反斜杠的使用频率要远高于斜杠的使用频率。本节其余部分将重点介绍反斜杠运算符;斜杠运算符的对应属性可以从以下恒等式推知:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(b/A)' = (A'\b').</span><br></pre></td></tr></table></figure>
<p>系数矩阵 <code>A</code> 不需要是方阵。如果 <code>A</code> 的大小为 m×n,则有三种情况:</p>
<table>
<thead>
<tr>
<th>m = n</th>
<th>方阵方程组。求精确解。</th>
</tr>
</thead>
<tbody><tr>
<td>m > n</td>
<td>超定方程组,即方程个数多于未知数个数。求最小二乘解。</td>
</tr>
<tr>
<td>m < n</td>
<td>欠定方程组,即方程个数少于未知数个数。使用最多 m 个非零分量求基本解。</td>
</tr>
</tbody></table>
<p><strong>mldivide 算法.</strong> <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a> 运算符使用不同的求解器来处理不同类型的系数矩阵。通过检查系数矩阵自动诊断各种情况。有关详细信息,请参阅 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a> 参考页的“算法”小节。</p>
<h4 id="通解"><a href="#通解" class="headerlink" title="通解"></a>通解</h4><p>线性方程组 Ax = b 的通解描述了所有可能的解。可以通过以下方法求通解:</p>
<ol>
<li>求对应的齐次方程组 Ax = 0 的解。使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/null.html"><code>null</code></a> 命令通过键入 <code>null(A)</code> 来执行此操作。这会将解空间的基向量恢复为 Ax = 0。任何解都是基向量的线性组合。</li>
<li>求非齐次方程组 Ax = b 的特定解。</li>
</ol>
<p>然后,可将 Ax = b 的任何解写成第 2 步中的 Ax = b 的特定解加上第 1 步中的基向量的线性组合之和。</p>
<p>本节其余部分将介绍如何使用 MATLAB 求 Ax = b 的特定解,如第 2 步中所述。</p>
<h4 id="方阵方程组"><a href="#方阵方程组" class="headerlink" title="方阵方程组"></a>方阵方程组</h4><p>最常见的情况涉及到一个方阵系数矩阵 <code>A</code> 和一个右侧单列向量 <code>b</code>。</p>
<p><strong>非奇异系数矩阵.</strong> 如果矩阵 <code>A</code> 是非奇异矩阵,则解 <code>x = A\b</code> 的大小与 <code>b</code> 的大小相同。例如:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">3</span>);</span><br><span class="line">u = [<span class="number">3</span>; <span class="number">1</span>; <span class="number">4</span>];</span><br><span class="line">x = A\u</span><br><span class="line"></span><br><span class="line">x =</span><br><span class="line"> <span class="number">10</span></span><br><span class="line"> <span class="number">-12</span></span><br><span class="line"> <span class="number">5</span></span><br></pre></td></tr></table></figure>
<p>可以确认 <code>A*x</code> 恰好等于 <code>u</code>。</p>
<p>如果 <code>A</code> 和 <code>b</code> 为方阵并且大小相同,则 <code>x= A\b</code> 也具有相同大小:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">b = <span class="built_in">magic</span>(<span class="number">3</span>);</span><br><span class="line">X = A\b</span><br><span class="line"></span><br><span class="line">X =</span><br><span class="line"> <span class="number">19</span> <span class="number">-3</span> <span class="number">-1</span></span><br><span class="line"> <span class="number">-17</span> <span class="number">4</span> <span class="number">13</span></span><br><span class="line"> <span class="number">6</span> <span class="number">0</span> <span class="number">-6</span></span><br></pre></td></tr></table></figure>
<p>可以确认 <code>A*x</code> 恰好等于 <code>b</code>。</p>
<p>以上两个示例具有确切的整数解。这是因为系数矩阵选为 <code>pascal(3)</code>,这是满秩矩阵(非奇异的)。</p>
<p><strong>奇异系数矩阵.</strong> 如果方阵 A 不包含线性无关的列,则该矩阵为奇异矩阵。如果 A 为奇异矩阵,则 Ax = b 的解将不存在或不唯一。如果 <code>A</code> 接近奇异或检测到完全奇异性,则反斜杠运算符 <code>A\b</code> 会发出警告。</p>
<p>如果 A 为奇异矩阵并且 Ax = b 具有解,可以通过键入以下内容求不是唯一的特定解</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">P = pinv(A)*b</span><br></pre></td></tr></table></figure>
<p><code>pinv(A)</code> 是 A 的伪逆。如果 Ax = b 没有精确解,则 <code>pinv(A)</code> 将返回最小二乘解。</p>
<p>例如:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">A = [ <span class="number">1</span> <span class="number">3</span> <span class="number">7</span></span><br><span class="line"> <span class="number">-1</span> <span class="number">4</span> <span class="number">4</span></span><br><span class="line"> <span class="number">1</span> <span class="number">10</span> <span class="number">18</span> ]</span><br></pre></td></tr></table></figure>
<p>为奇异矩阵,可以通过键入以下内容进行验证:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">rank(A)</span><br><span class="line"></span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">2</span></span><br></pre></td></tr></table></figure>
<p>由于 A 不是满秩,它有一些等于零的奇异值。</p>
<p><strong>精确解。</strong>对于 <code>b =[5;2;12]</code>,方程 Ax = b 具有精确解,给定</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pinv(A)*b</span><br><span class="line"></span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"> <span class="number">0.3850</span></span><br><span class="line"> <span class="number">-0.1103</span></span><br><span class="line"> <span class="number">0.7066</span></span><br></pre></td></tr></table></figure>
<p>通过键入以下内容验证 <code>pinv(A)*b</code> 是否为精确解</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">A*pinv(A)*b</span><br><span class="line"></span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"> <span class="number">5.0000</span></span><br><span class="line"> <span class="number">2.0000</span></span><br><span class="line"> <span class="number">12.0000</span></span><br></pre></td></tr></table></figure>
<p><strong>最小二乘解。</strong>但是,如果 <code>b = [3;6;0]</code>,则 Ax = b 没有精确解。在这种情况下,<code>pinv(A)*b</code> 会返回最小二乘解。键入</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">A*pinv(A)*b</span><br><span class="line"></span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"> <span class="number">-1.0000</span></span><br><span class="line"> <span class="number">4.0000</span></span><br><span class="line"> <span class="number">2.0000</span></span><br></pre></td></tr></table></figure>
<p>则不会返回原始向量 <code>b</code>。</p>
<p>通过得到增广矩阵 <code>[A b]</code> 的简化行阶梯形式,可以确定 Ax = b 是否具有精确解。为此,对于此示例请输入</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">rref([A b])</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0</span> <span class="number">2.2857</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">1.0000</span> <span class="number">1.5714</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1.0000</span></span><br></pre></td></tr></table></figure>
<p>由于最下面一行全部为零(最后一项除外),因此该方程无解。在这种情况下,<code>pinv(A)</code> 会返回最小二乘解。</p>
<h4 id="超定方程组"><a href="#超定方程组" class="headerlink" title="超定方程组"></a>超定方程组</h4><p>尝试此示例Copy Command Copy Code</p>
<p>此示例说明在对试验数据的各种曲线拟合中通常会如何遇到超定方程组。</p>
<p>在多个不同的时间值 <code>t</code> 对数量 <code>y</code> 进行测量以生成以下观测值。可以使用以下语句输入数据并在表中查看该数据。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">t = [<span class="number">0</span> <span class="number">.3</span> <span class="number">.8</span> <span class="number">1.1</span> <span class="number">1.6</span> <span class="number">2.3</span>]';</span><br><span class="line">y = [<span class="number">.82</span> <span class="number">.72</span> <span class="number">.63</span> <span class="number">.60</span> <span class="number">.55</span> <span class="number">.50</span>]';</span><br><span class="line">B = <span class="built_in">table</span>(t,y)</span><br><span class="line">B=<span class="number">6</span>×<span class="number">2</span> <span class="built_in">table</span></span><br><span class="line"> t y </span><br><span class="line"> ___ ____</span><br><span class="line"></span><br><span class="line"> <span class="number">0</span> <span class="number">0.82</span></span><br><span class="line"> <span class="number">0.3</span> <span class="number">0.72</span></span><br><span class="line"> <span class="number">0.8</span> <span class="number">0.63</span></span><br><span class="line"> <span class="number">1.1</span> <span class="number">0.6</span></span><br><span class="line"> <span class="number">1.6</span> <span class="number">0.55</span></span><br><span class="line"> <span class="number">2.3</span> <span class="number">0.5</span></span><br></pre></td></tr></table></figure>
<p>尝试使用指数衰减函数对数据进行建模</p>
<p><em>y</em>(<em>t</em>)=<em>c</em>1+<em>c</em>2<em>e</em>−<em>t</em>。</p>
<p>上一方程表明,向量 <code>y</code> 应由两个其他向量的线性组合来逼近。一个是元素全部为 1 的常向量,另一个是带有分量 <code>exp(-t)</code> 的向量。未知系数 <em>c</em>1 和 <em>c</em>2 可以通过执行最小二乘拟合来计算,这样会最大限度地减小数据与模型偏差的平方和。在两个未知系数的情况下有六个方程,用 6×2 矩阵表示。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">E = [<span class="built_in">ones</span>(<span class="built_in">size</span>(t)) <span class="built_in">exp</span>(-t)]</span><br><span class="line">E = <span class="number">6</span>×<span class="number">2</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0.7408</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0.4493</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0.3329</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0.2019</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0.1003</span></span><br></pre></td></tr></table></figure>
<p>使用反斜杠运算符获取最小二乘解。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">c = E\y</span><br><span class="line">c = <span class="number">2</span>×<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="number">0.4760</span></span><br><span class="line"> <span class="number">0.3413</span></span><br></pre></td></tr></table></figure>
<p>也就是说,对数据的最小二乘拟合为</p>
<p><em>y</em>(<em>t</em>)=0.4760+0.3413<em>e</em>−<em>t</em>.</p>
<p>以下语句按固定间隔的 <code>t</code> 增量为模型求值,然后与原始数据一同绘制结果:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">T = (<span class="number">0</span>:<span class="number">0.1</span>:<span class="number">2.5</span>)';</span><br><span class="line">Y = [<span class="built_in">ones</span>(<span class="built_in">size</span>(T)) <span class="built_in">exp</span>(-T)]*c;</span><br><span class="line"><span class="built_in">plot</span>(T,Y,<span class="string">'-'</span>,t,y,<span class="string">'o'</span>)</span><br></pre></td></tr></table></figure>
<p><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207231643203.png" alt="Figure contains an axes object. The axes object contains 2 objects of type line."></p>
<p><code>E*c</code> 与 <code>y</code> 不完全相等,但差值可能远小于原始数据中的测量误差。</p>
<p>如果矩形矩阵 <code>A</code> 没有线性无关的列,则该矩阵秩亏。如果 <code>A</code> 秩亏,则 <code>AX = B</code> 的最小二乘解不唯一。如果 <code>A</code> 秩亏,则 <code>A\B</code> 会发出警告,并生成一个最小二乘解。您可以使用 <code>lsqminnorm</code> 求在所有解中具有最小范数的解 <code>X</code>。</p>
<h4 id="欠定方程组"><a href="#欠定方程组" class="headerlink" title="欠定方程组"></a>欠定方程组</h4><p>本例演示了欠定方程组的解不唯一的情况。欠定线性方程组包含的未知数比方程多。MATLAB 矩阵左除运算求基本最小二乘解,对于 <code>m</code>×<code>n</code> 系数矩阵,它最多有 <code>m</code> 个非零分量。</p>
<p>以下是一个简单的随机示例:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">R = [<span class="number">6</span> <span class="number">8</span> <span class="number">7</span> <span class="number">3</span>; <span class="number">3</span> <span class="number">5</span> <span class="number">4</span> <span class="number">1</span>]</span><br><span class="line">rng(<span class="number">0</span>);</span><br><span class="line">b = randi(<span class="number">8</span>,<span class="number">2</span>,<span class="number">1</span>)</span><br><span class="line">R =</span><br><span class="line"></span><br><span class="line"> <span class="number">6</span> <span class="number">8</span> <span class="number">7</span> <span class="number">3</span> </span><br><span class="line"> <span class="number">3</span> <span class="number">5</span> <span class="number">4</span> <span class="number">1</span> </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">b =</span><br><span class="line"></span><br><span class="line"> <span class="number">7</span> </span><br><span class="line"> <span class="number">8</span> </span><br></pre></td></tr></table></figure>
<p>线性方程组 <code>Rp = b</code> 有两个方程,四个未知数。由于系数矩阵包含较小的整数,因此适合使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/format.html"><code>format</code></a> 命令以有理格式显示解。通过以下命令可获取特定解</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">format <span class="built_in">rat</span></span><br><span class="line">p = R\b</span><br><span class="line">p =</span><br><span class="line"></span><br><span class="line"> <span class="number">0</span> </span><br><span class="line"> <span class="number">17</span>/<span class="number">7</span> </span><br><span class="line"> <span class="number">0</span> </span><br><span class="line"> <span class="number">-29</span>/<span class="number">7</span> </span><br></pre></td></tr></table></figure>
<p>其中一个非零分量为 <code>p(2)</code>,因为 <code>R(:,2)</code> 是具有最大范数的 <code>R</code> 的列。另一个非零分量为 <code>p(4)</code>,因为 <code>R(:,4)</code> 在消除 <code>R(:,2)</code> 后起控制作用。</p>
<p>欠定方程组的完全通解可以通过 <code>p</code> 加上任意零空间向量线性组合来表示,可以使用 <code>null</code> 函数(使用请求有理基的选项)计算该空间向量。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Z = null(R,<span class="string">'r'</span>)</span><br><span class="line">Z =</span><br><span class="line"></span><br><span class="line"> <span class="number">-1</span>/<span class="number">2</span> <span class="number">-7</span>/<span class="number">6</span> </span><br><span class="line"> <span class="number">-1</span>/<span class="number">2</span> <span class="number">1</span>/<span class="number">2</span> </span><br><span class="line"> <span class="number">1</span> <span class="number">0</span> </span><br><span class="line"> <span class="number">0</span> <span class="number">1</span> </span><br></pre></td></tr></table></figure>
<p>可以确认 <code>R*Z</code> 为零,并且残差 <code>R*x - b</code> 远远小于任一向量 <code>x</code>(其中</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">x = p + Z*q</span><br></pre></td></tr></table></figure>
<p>由于 <code>Z</code> 的列是零空间向量,因此 <code>Z*q</code> 是以下向量的线性组合:</p>
<p><em>Z**q</em>=(⇀<em>x</em>1⇀<em>x</em>2)(<em>u**w</em>)=<em>u</em>⇀<em>x</em>1+<em>w</em>⇀<em>x</em>2 .</p>
<p>为了说明这一点,选择任意 <code>q</code> 并构造 <code>x</code>。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">q = [<span class="number">-2</span>; <span class="number">1</span>];</span><br><span class="line">x = p + Z*q;</span><br></pre></td></tr></table></figure>
<p>计算残差的范数。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">format short</span><br><span class="line">norm(R*x - b)</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">2.6645e-15</span></span><br></pre></td></tr></table></figure>
<p>如果有无限多个解,则最小范数解具有特别意义。您可以使用 <code>lsqminnorm</code> 计算最小范数最小二乘解。该解具有 <code>norm(p)</code> 的最小可能值。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">p = lsqminnorm(R,b)</span><br><span class="line">p =</span><br><span class="line"></span><br><span class="line"> <span class="number">-207</span>/<span class="number">137</span> </span><br><span class="line"> <span class="number">365</span>/<span class="number">137</span> </span><br><span class="line"> <span class="number">79</span>/<span class="number">137</span> </span><br><span class="line"> <span class="number">-424</span>/<span class="number">137</span> </span><br></pre></td></tr></table></figure>
<h4 id="多右端线性方程组的求解"><a href="#多右端线性方程组的求解" class="headerlink" title="多右端线性方程组的求解"></a>多右端线性方程组的求解</h4><p>某些问题涉及求解具有相同系数矩阵 <code>A</code> 但具有不同右端 <code>b</code> 的线性方程组。如果可以同时使用不同的 <code>b</code> 值,则可以将 <code>b</code> 构造为多列矩阵,并使用单个反斜杠命令求解所有方程组:<code>X = A\[b1 b2 b3 …]</code>。</p>
<p>但是,有时不同的 <code>b</code> 值并非全部同时可用,也就是说,您需要连续求解若干方程组。如果使用斜杠 (/) 或反斜杠 () 求解其中一个方程组,则该运算符会对系数矩阵 <code>A</code> 进行分解,并使用此矩阵分解来求解。然而,随后每次使用不同的 <code>b</code> 求解类似方程组时,运算符都会对 <code>A</code> 进行同样的分解,而这是一次冗余计算。</p>
<p>此问题的求解是预先计算 <code>A</code> 的分解,然后重新使用因子对 <code>b</code> 的不同值求解。但是,实际上,以这种方式预先计算分解可能很困难,因为需要知道要计算的分解(LU、LDL、Cholesky 等)以及如何乘以因子才能对问题求解。例如,使用 LU 分解,您需要求解两个线性方程组才能求解原始方程组 Ax = b:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[L,U] = lu(A);</span><br><span class="line">x = U \ (L \ b);</span><br></pre></td></tr></table></figure>
<p>对于具有若干连续右端的线性方程组,建议使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/decomposition.html"><code>decomposition</code></a> 对象求解。借助这些对象,您可利用预先计算矩阵分解带来的性能优势,而<em>不必</em>了解如何使用矩阵因子。您可以将先前的 LU 分解替换为:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dA = decomposition(A,<span class="string">'lu'</span>);</span><br><span class="line">x = dA\b;</span><br></pre></td></tr></table></figure>
<p>如果您不确定要使用哪种分解,<code>decomposition(A)</code> 会根据 <code>A</code> 的属性选择正确的类型,类似于反斜杠的功能。</p>
<p>以下简单测试验证了此方法可能带来的性能优势。该测试分别使用反斜杠 () 和 <code>decomposition</code> 对同一稀疏线性方程组求解 100 次。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">n = <span class="number">1e3</span>;</span><br><span class="line">A = sprand(n,n,<span class="number">0.2</span>) + speye(n);</span><br><span class="line">b = <span class="built_in">ones</span>(n,<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">% Backslash solution</span></span><br><span class="line">tic</span><br><span class="line"><span class="keyword">for</span> k = <span class="number">1</span>:<span class="number">100</span></span><br><span class="line"> x = A\b;</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">toc</span><br><span class="line">Elapsed time is <span class="number">9.006156</span> seconds.</span><br><span class="line"><span class="comment">% decomposition solution</span></span><br><span class="line">tic</span><br><span class="line">dA = decomposition(A);</span><br><span class="line"><span class="keyword">for</span> k = <span class="number">1</span>:<span class="number">100</span></span><br><span class="line"> x = dA\b;</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">toc</span><br><span class="line">Elapsed time is <span class="number">0.374347</span> seconds.</span><br></pre></td></tr></table></figure>
<p>对于这个问题,<code>decomposition</code> 求解比单独使用反斜杠要快得多,而语法仍然很简单。</p>
<h4 id="迭代法"><a href="#迭代法" class="headerlink" title="迭代法"></a>迭代法</h4><p>如果系数矩阵 A 很大并且是稀疏矩阵,分解方法一般情况下将不会有效。<em>迭代方法</em>可生成一系列近似解。MATLAB 提供了多个迭代方法来处理大型的稀疏输入矩阵。</p>
<table>
<thead>
<tr>
<th align="left">函数</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/pcg.html"><code>pcg</code></a></td>
<td align="left">预条件共轭梯度法。此方法适用于 Hermitian 正定系数矩阵 A。</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/bicg.html"><code>bicg</code></a></td>
<td align="left">双共轭梯度法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/bicgstab.html"><code>bicgstab</code></a></td>
<td align="left">双共轭梯度稳定法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/bicgstabl.html"><code>bicgstabl</code></a></td>
<td align="left">双共轭梯度稳定法(l)</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/cgs.html"><code>cgs</code></a></td>
<td align="left">共轭梯度二乘法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/gmres.html"><code>gmres</code></a></td>
<td align="left">广义最小残差法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/lsqr.html"><code>lsqr</code></a></td>
<td align="left">LSQR 方法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/minres.html"><code>minres</code></a></td>
<td align="left">最小残差法。此方法适用于 Hermitian 系数矩阵 A。</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/qmr.html"><code>qmr</code></a></td>
<td align="left">拟最小残差法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/symmlq.html"><code>symmlq</code></a></td>
<td align="left">对称的 LQ 方法</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/tfqmr.html"><code>tfqmr</code></a></td>
<td align="left">无转置 QMR 方法</td>
</tr>
</tbody></table>
<h4 id="多线程计算"><a href="#多线程计算" class="headerlink" title="多线程计算"></a>多线程计算</h4><p>对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:</p>
<ol>
<li>函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。</li>
<li>数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。</li>
<li>运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。</li>
</ol>
<p>如果启用多线程,<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/inv.html"><code>inv</code></a>、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/lscov.html"><code>lscov</code></a>、<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/linsolve.html"><code>linsolve</code></a> 和 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a> 将会对大型双精度数组(约 10,000 个元素或更多)大幅增加速度。</p>
<h4 id="另请参阅"><a href="#另请参阅" class="headerlink" title="另请参阅"></a>另请参阅</h4><p><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mldivide.html"><code>mldivide</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mrdivide.html"><code>mrdivide</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/pinv.html"><code>pinv</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/decomposition.html"><code>decomposition</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/lsqminnorm.html"><code>lsqminnorm</code></a></p>
<h4 id="相关主题-1"><a href="#相关主题-1" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-988203">MATLAB 环境中的矩阵</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2418">分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2852">特征值</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-960721">奇异值</a></li>
</ul>
<h3 id="3-分解"><a href="#3-分解" class="headerlink" title="3. 分解"></a>3. 分解</h3><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#brcdwoa">简介</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2432">Cholesky 分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2502">LU 分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2568">QR 分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#brs0fvv-1">对分解使用多线程计算</a></li>
</ul>
<h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p>本节中讨论的所有三种矩阵分解利用了<em>三角形</em>矩阵,其中对角线上下的所有元素都为零。涉及三角矩阵的线性方程组可以使用<em>前代</em>或<em>回代</em>方法轻松快捷地求解。</p>
<h4 id="Cholesky-分解"><a href="#Cholesky-分解" class="headerlink" title="Cholesky 分解"></a>Cholesky 分解</h4><p>Cholesky 分解将对称矩阵表示为三角矩阵与其转置的积</p>
<p>A = R′R,</p>
<p>其中,R 是上三角矩阵。</p>
<p>并非所有对称矩阵都可以通过这种方式进行分解;采用此类分解的矩阵被视为正定矩阵。这表明,A 的所有对角线元素都是正数,并且非对角线元素“不太大”。帕斯卡矩阵提供了有趣的示例。在本章中,示例矩阵 <code>A</code> 为 3×3 帕斯卡矩阵。暂时转换为 6×6:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">A = <span class="built_in">pascal</span>(<span class="number">6</span>)</span><br><span class="line"></span><br><span class="line">A =</span><br><span class="line"> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span> <span class="number">4</span> <span class="number">5</span> <span class="number">6</span></span><br><span class="line"> <span class="number">1</span> <span class="number">3</span> <span class="number">6</span> <span class="number">10</span> <span class="number">15</span> <span class="number">21</span></span><br><span class="line"> <span class="number">1</span> <span class="number">4</span> <span class="number">10</span> <span class="number">20</span> <span class="number">35</span> <span class="number">56</span></span><br><span class="line"> <span class="number">1</span> <span class="number">5</span> <span class="number">15</span> <span class="number">35</span> <span class="number">70</span> <span class="number">126</span></span><br><span class="line"> <span class="number">1</span> <span class="number">6</span> <span class="number">21</span> <span class="number">56</span> <span class="number">126</span> <span class="number">252</span></span><br></pre></td></tr></table></figure>
<p><code>A</code> 的元素为二项式系数。每个元素都是其北向和西向邻点之和。Cholesky 分解为</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">R = chol(A)</span><br><span class="line"></span><br><span class="line">R =</span><br><span class="line"> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">0</span> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span> <span class="number">4</span> <span class="number">5</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">1</span> <span class="number">3</span> <span class="number">6</span> <span class="number">10</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1</span> <span class="number">4</span> <span class="number">10</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1</span> <span class="number">5</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>这些元素同样为二项式系数。<code>R'*R</code> 等于 <code>A</code> 的情况说明了涉及二项式系数的积之和的单位矩阵。</p>
<p><strong>注意</strong></p>
<p>Cholesky 分解也适用于复矩阵。采用 Cholesky 分解的任何复矩阵都满足</p>
<p>A′ = A</p>
<p>,并且被视为 <em>Hermitian 正定矩阵</em>。</p>
<p>通过 Cholesky 分解,可以将线性方程组</p>
<p>Ax = b</p>
<p>替换为</p>
<p>R′Rx = b。</p>
<p>由于反斜杠运算符能识别三角形方程组,因此这可以在 MATLAB 环境中通过以下表达式快速进行求解</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">x = R\(R'\b)</span><br></pre></td></tr></table></figure>
<p>如果 <code>A</code> 为 n×n,则 <code>chol(A)</code> 的计算复杂度为 O(n3),但后续的反斜杠解的复杂度仅为 O(n2)。</p>
<h4 id="LU-分解"><a href="#LU-分解" class="headerlink" title="LU 分解"></a>LU 分解</h4><p>LU 分解(或高斯消去法)将任何方阵 A 都表示为下三角矩阵和上三角矩阵的置换之积</p>
<p>A = LU,</p>
<p>其中,L 是对角线元素为 1 的下三角矩阵的置换,U 是上三角矩阵。</p>
<p>出于理论和计算原因,必须进行置换。矩阵</p>
<p>[0110]</p>
<p>在不交换其两行的情况下不能表示为三角矩阵的积。尽管矩阵</p>
<p>[<em>ε</em>110]</p>
<p>可以表示为三角矩阵之积,但当 ε 很小时,因子中的元素也会很大并且会增大误差,因此即使置换并非完全必要,它们也是所希望的。部分主元消去法可确保 L 的元素的模以 1 为限,并且 U 的元素并不大于 A 的元素。</p>
<p>例如:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[L,U] = lu(B)</span><br><span class="line"></span><br><span class="line">L =</span><br><span class="line"> <span class="number">1.0000</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0.3750</span> <span class="number">0.5441</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">0.5000</span> <span class="number">1.0000</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">U =</span><br><span class="line"> <span class="number">8.0000</span> <span class="number">1.0000</span> <span class="number">6.0000</span></span><br><span class="line"> <span class="number">0</span> <span class="number">8.5000</span> <span class="number">-1.0000</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">5.2941</span></span><br></pre></td></tr></table></figure>
<p>通过对 <code>A</code> 执行 LU 分解,可以</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">A*x = b</span><br></pre></td></tr></table></figure>
<p>使用以下表达式快速对线性方程组求解</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">x = U\(L\b)</span><br></pre></td></tr></table></figure>
<p>行列式和逆矩阵是通过 LU 分解使用以下表达式进行计算的</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">det(A) = det(L)*det(U)</span><br></pre></td></tr></table></figure>
<p>和</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">inv(A) = inv(U)*inv(L)</span><br></pre></td></tr></table></figure>
<p>也可以使用 <code>det(A) = prod(diag(U))</code> 计算行列式,但行列式的符号可能会相反。</p>
<h4 id="QR-分解"><a href="#QR-分解" class="headerlink" title="QR 分解"></a>QR 分解</h4><p><em>正交</em>矩阵或包含正交列的矩阵为实矩阵,其列全部具有单位长度并且相互垂直。如果 Q 为正交矩阵,则</p>
<p>QTQ = I,</p>
<p>其中 I 是单位矩阵。</p>
<p>最简单的正交矩阵为二维坐标旋转:</p>
<p>[cos(<em>θ</em>)−sin(<em>θ</em>)sin(<em>θ</em>)cos(<em>θ</em>)].</p>
<p>对于复矩阵,对应的术语为<em>单位</em>。由于正交矩阵和单位矩阵会保留长度、保留角度并且不会增大误差,因此适用于数值计算。</p>
<p>正交或 QR 分解将任何矩形矩阵表示为正交或酉矩阵与上三角矩阵的积。此外,也可能涉及列置换。</p>
<p>A = QR</p>
<p>或</p>
<p>AP = QR,</p>
<p>其中,Q 为正交或单位矩阵,R 为上三角矩阵,P 为置换向量。</p>
<p>QR 分解有四种变化形式 - 完全大小或合适大小,以及使用列置换或不使用列置换。</p>
<p>超定线性方程组涉及行数超过列数的矩形矩阵,也即 m×n 并且 m > n。完全大小的 QR 分解可生成一个方阵(m×m 正交矩阵 Q)和一个矩形 m×n 上三角矩阵 R:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">C=<span class="built_in">gallery</span>(<span class="string">'uniformdata'</span>,[<span class="number">5</span> <span class="number">4</span>], <span class="number">0</span>);</span><br><span class="line">[Q,R] = qr(C)</span><br><span class="line"></span><br><span class="line">Q =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6191</span> <span class="number">0.1406</span> <span class="number">-0.1899</span> <span class="number">-0.5058</span> <span class="number">0.5522</span></span><br><span class="line"> <span class="number">0.1506</span> <span class="number">0.4084</span> <span class="number">0.5034</span> <span class="number">0.5974</span> <span class="number">0.4475</span></span><br><span class="line"> <span class="number">0.3954</span> <span class="number">-0.5564</span> <span class="number">0.6869</span> <span class="number">-0.1478</span> <span class="number">-0.2008</span></span><br><span class="line"> <span class="number">0.3167</span> <span class="number">0.6676</span> <span class="number">0.1351</span> <span class="number">-0.1729</span> <span class="number">-0.6370</span></span><br><span class="line"> <span class="number">0.5808</span> <span class="number">-0.2410</span> <span class="number">-0.4695</span> <span class="number">0.5792</span> <span class="number">-0.2207</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">R =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.5346</span> <span class="number">1.0663</span> <span class="number">1.2010</span> <span class="number">1.4036</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0.7245</span> <span class="number">0.3474</span> <span class="number">-0.0126</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0.9320</span> <span class="number">0.6596</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0.6648</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span></span><br></pre></td></tr></table></figure>
<p>在许多情况下,Q 的最后 m – n 列是不需要的,因为这些列会与 R 底部的零相乘。因此,精简 QR 分解可生成一个矩形矩阵(具有正交列的 m×n Q)以及一个方阵 n×n 上三角矩阵 R。对于 5×4 示例,不会节省太多内存,但是对于更大的大量矩形矩阵,在时间和内存方面的节省可能会很重要:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[Q,R] = qr(C,<span class="number">0</span>) </span><br><span class="line">Q =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6191</span> <span class="number">0.1406</span> <span class="number">-0.1899</span> <span class="number">-0.5058</span></span><br><span class="line"> <span class="number">0.1506</span> <span class="number">0.4084</span> <span class="number">0.5034</span> <span class="number">0.5974</span></span><br><span class="line"> <span class="number">0.3954</span> <span class="number">-0.5564</span> <span class="number">0.6869</span> <span class="number">-0.1478</span></span><br><span class="line"> <span class="number">0.3167</span> <span class="number">0.6676</span> <span class="number">0.1351</span> <span class="number">-0.1729</span></span><br><span class="line"> <span class="number">0.5808</span> <span class="number">-0.2410</span> <span class="number">-0.4695</span> <span class="number">0.5792</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">R =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.5346</span> <span class="number">1.0663</span> <span class="number">1.2010</span> <span class="number">1.4036</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0.7245</span> <span class="number">0.3474</span> <span class="number">-0.0126</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0.9320</span> <span class="number">0.6596</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0.6648</span></span><br></pre></td></tr></table></figure>
<p>与 LU 分解相比,QR 分解不需要进行任何消元或置换。但是,可选的列置换(因存在第三个输出参数而触发)对检测奇异性或秩亏是很有帮助的。在分解的每一步,未分解的剩余矩阵的列(范数最大)将用作该步骤的基础。这可以确保 R 的对角线元素以降序排列,并且各列之间的任何线性相关性肯定能够通过检查这些元素来显示。对于此处提供的小示例,<code>C</code> 的第二列的范数大于第一列的范数,因此这两列被交换:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[Q,R,P] = qr(C)</span><br><span class="line"></span><br><span class="line">Q =</span><br><span class="line"> <span class="number">-0.3522</span> <span class="number">0.8398</span> <span class="number">-0.4131</span></span><br><span class="line"> <span class="number">-0.7044</span> <span class="number">-0.5285</span> <span class="number">-0.4739</span></span><br><span class="line"> <span class="number">-0.6163</span> <span class="number">0.1241</span> <span class="number">0.7777</span></span><br><span class="line"></span><br><span class="line">R =</span><br><span class="line"> <span class="number">-11.3578</span> <span class="number">-8.2762</span></span><br><span class="line"> <span class="number">0</span> <span class="number">7.2460</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">P =</span><br><span class="line"> <span class="number">0</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">0</span></span><br></pre></td></tr></table></figure>
<p>组合了合适大小和列置换后,第三个输出参数为置换向量而不是置换矩阵:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[Q,R,p] = qr(C,<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">Q =</span><br><span class="line"> <span class="number">-0.3522</span> <span class="number">0.8398</span></span><br><span class="line"> <span class="number">-0.7044</span> <span class="number">-0.5285</span></span><br><span class="line"> <span class="number">-0.6163</span> <span class="number">0.1241</span></span><br><span class="line"></span><br><span class="line">R =</span><br><span class="line"> <span class="number">-11.3578</span> <span class="number">-8.2762</span></span><br><span class="line"> <span class="number">0</span> <span class="number">7.2460</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p =</span><br><span class="line"> <span class="number">2</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>QR 分解可将超定线性方程组转换为等效的三角形方程组。表达式</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">norm(A*x - b)</span><br></pre></td></tr></table></figure>
<p>等于</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">norm(Q*R*x - b)</span><br></pre></td></tr></table></figure>
<p>与正交矩阵相乘可保留欧几里德范数,因此该表达式也等于</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">norm(R*x - y)</span><br></pre></td></tr></table></figure>
<p>其中 <code>y = Q'*b</code>。由于 R 的最后 m-n 行为零,因此该表达式将分为两部分:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">norm(R(<span class="number">1</span>:n,<span class="number">1</span>:n)*x - y(<span class="number">1</span>:n))</span><br></pre></td></tr></table></figure>
<p>并且</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">norm(y(n+<span class="number">1</span>:m))</span><br></pre></td></tr></table></figure>
<p>如果 <code>A</code> 具有满秩,则可以对 <code>x</code> 求解,使这些表达式中的第一个表达式为零。然后,第二个表达式便可以提供残差范数。如果 <code>A</code> 没有满秩,则可以通过 <code>R</code> 的三角形结构体对最小二乘问题求基本解。</p>
<h4 id="对分解使用多线程计算"><a href="#对分解使用多线程计算" class="headerlink" title="对分解使用多线程计算"></a>对分解使用多线程计算</h4><p>对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:</p>
<ol>
<li>函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。</li>
<li>数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。</li>
<li>运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。</li>
</ol>
<p>对于大型双精度数组(约 10,000 个元素),<a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/lu.html"><code>lu</code></a> 和 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/qr.html"><code>qr</code></a> 会大幅增加速度。</p>
<h4 id="另请参阅-1"><a href="#另请参阅-1" class="headerlink" title="另请参阅"></a>另请参阅</h4><p><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/lu.html"><code>lu</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/qr.html"><code>qr</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/chol.html"><code>chol</code></a></p>
<h4 id="相关主题-2"><a href="#相关主题-2" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-988203">MATLAB 环境中的矩阵</a></li>
</ul>
<h3 id="4-幂和指数"><a href="#4-幂和指数" class="headerlink" title="4. 幂和指数"></a>4. 幂和指数</h3><p>尝试此示例Copy Command Copy Code</p>
<p>本主题说明如何使用各种方法计算矩阵幂和指数。</p>
<p><strong>正整数幂</strong></p>
<p>如果 <code>A</code> 为方阵并且 <code>p</code> 为正整数,则 <code>A^p</code> 实际上是将 <code>A</code> 乘以其自身 <code>p-1</code> 次。例如:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">A = [<span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span></span><br><span class="line"> <span class="number">1</span> <span class="number">3</span> <span class="number">6</span>];</span><br><span class="line">A^<span class="number">2</span></span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">3</span> <span class="number">6</span> <span class="number">10</span></span><br><span class="line"> <span class="number">6</span> <span class="number">14</span> <span class="number">25</span></span><br><span class="line"> <span class="number">10</span> <span class="number">25</span> <span class="number">46</span></span><br></pre></td></tr></table></figure>
<p><strong>逆幂和分数幂</strong></p>
<p>如果 <code>A</code> 为方阵并且是非奇异的,则 <code>A^(-p)</code> 实际上是将 <code>inv(A)</code> 乘以其自身 <code>p-1</code> 次。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">A^(<span class="number">-3</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">145.0000</span> <span class="number">-207.0000</span> <span class="number">81.0000</span></span><br><span class="line"> <span class="number">-207.0000</span> <span class="number">298.0000</span> <span class="number">-117.0000</span></span><br><span class="line"> <span class="number">81.0000</span> <span class="number">-117.0000</span> <span class="number">46.0000</span></span><br></pre></td></tr></table></figure>
<p>MATLAB® 用相同的算法计算 <code>inv(A)</code> 和 <code>A^(-1)</code>,因此结果完全相同。如果矩阵接近奇异,<code>inv(A)</code> 和 <code>A^(-1)</code> 都会发出警告。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">isequal</span>(inv(A),A^(<span class="number">-1</span>))</span><br><span class="line"><span class="built_in">ans</span> = logical</span><br><span class="line"> <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>也允许分数幂,例如 <code>A^(2/3)</code>。使用小数幂的结果取决于矩阵特征值的分布。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">A^(<span class="number">2</span>/<span class="number">3</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">0.8901</span> <span class="number">0.5882</span> <span class="number">0.3684</span></span><br><span class="line"> <span class="number">0.5882</span> <span class="number">1.2035</span> <span class="number">1.3799</span></span><br><span class="line"> <span class="number">0.3684</span> <span class="number">1.3799</span> <span class="number">3.1167</span></span><br></pre></td></tr></table></figure>
<p><strong>逐元素幂</strong></p>
<p><code>.^</code> 运算符计算逐元素幂。例如,要对矩阵中的每个元素求平方,可以使用 <code>A.^2</code>。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">A.^<span class="number">2</span></span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1</span> <span class="number">1</span> <span class="number">1</span></span><br><span class="line"> <span class="number">1</span> <span class="number">4</span> <span class="number">9</span></span><br><span class="line"> <span class="number">1</span> <span class="number">9</span> <span class="number">36</span></span><br></pre></td></tr></table></figure>
<p><strong>平方根</strong></p>
<p>使用 <code>sqrt</code> 函数可以方便地计算矩阵中每个元素的平方根。另一种方法是 <code>A.^(1/2)</code>。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sqrt</span>(A)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.0000</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.4142</span> <span class="number">1.7321</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.7321</span> <span class="number">2.4495</span></span><br></pre></td></tr></table></figure>
<p>对于其他根,您可以使用 <code>nthroot</code>。例如,计算 <code>A.^(1/3)</code>。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">nthroot</span>(A,<span class="number">3</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.0000</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.2599</span> <span class="number">1.4422</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.4422</span> <span class="number">1.8171</span></span><br></pre></td></tr></table></figure>
<p>这些按元素计算的根不同于矩阵平方根,后者计算得到的是另一个矩阵 <em>B</em> 以满足 <em>A</em>=BB。函数 <code>sqrtm(A)</code> 采用更精确的算法计算 <code>A^(1/2)</code>。<code>sqrtm</code> 中的 <code>m</code> 将此函数与 <code>sqrt(A)</code> 区分开来,后者与 <code>A.^(1/2)</code> 一样,以逐元素方式工作。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">B = sqrtm(A)</span><br><span class="line">B = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">0.8775</span> <span class="number">0.4387</span> <span class="number">0.1937</span></span><br><span class="line"> <span class="number">0.4387</span> <span class="number">1.0099</span> <span class="number">0.8874</span></span><br><span class="line"> <span class="number">0.1937</span> <span class="number">0.8874</span> <span class="number">2.2749</span></span><br><span class="line">B^<span class="number">2</span></span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.0000</span> <span class="number">1.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">2.0000</span> <span class="number">3.0000</span></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">3.0000</span> <span class="number">6.0000</span></span><br></pre></td></tr></table></figure>
<p><strong>标量底</strong></p>
<p>除了对矩阵求幂以外,您还可以以矩阵为次数对标量求幂。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2</span>^A</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">10.4630</span> <span class="number">21.6602</span> <span class="number">38.5862</span></span><br><span class="line"> <span class="number">21.6602</span> <span class="number">53.2807</span> <span class="number">94.6010</span></span><br><span class="line"> <span class="number">38.5862</span> <span class="number">94.6010</span> <span class="number">173.7734</span></span><br></pre></td></tr></table></figure>
<p>当您以矩阵为次数对标量求幂时,MATLAB 使用矩阵的特征值和特征向量来计算矩阵幂。如果 <code>[V,D] = eig(A)</code>,则 2<em>A</em>=<em>V</em> 2<em>D</em> <em>V</em>−1。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[V,D] = eig(A);</span><br><span class="line">V*<span class="number">2</span>^D*V^(<span class="number">-1</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"></span><br><span class="line"> <span class="number">10.4630</span> <span class="number">21.6602</span> <span class="number">38.5862</span></span><br><span class="line"> <span class="number">21.6602</span> <span class="number">53.2807</span> <span class="number">94.6010</span></span><br><span class="line"> <span class="number">38.5862</span> <span class="number">94.6010</span> <span class="number">173.7734</span></span><br></pre></td></tr></table></figure>
<p><strong>矩阵指数</strong></p>
<p>矩阵指数是以矩阵为次数对标量求幂的特殊情况。矩阵指数的底是欧拉数 <code>e = exp(1)</code>。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">e = <span class="built_in">exp</span>(<span class="number">1</span>);</span><br><span class="line">e^A</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"><span class="number">103</span> ×</span><br><span class="line"></span><br><span class="line"> <span class="number">0.1008</span> <span class="number">0.2407</span> <span class="number">0.4368</span></span><br><span class="line"> <span class="number">0.2407</span> <span class="number">0.5867</span> <span class="number">1.0654</span></span><br><span class="line"> <span class="number">0.4368</span> <span class="number">1.0654</span> <span class="number">1.9418</span></span><br></pre></td></tr></table></figure>
<p><code>expm</code> 函数是计算矩阵指数的一种更方便的方法。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">expm(A)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">3</span>×<span class="number">3</span></span><br><span class="line"><span class="number">103</span> ×</span><br><span class="line"></span><br><span class="line"> <span class="number">0.1008</span> <span class="number">0.2407</span> <span class="number">0.4368</span></span><br><span class="line"> <span class="number">0.2407</span> <span class="number">0.5867</span> <span class="number">1.0654</span></span><br><span class="line"> <span class="number">0.4368</span> <span class="number">1.0654</span> <span class="number">1.9418</span></span><br></pre></td></tr></table></figure>
<p>矩阵指数可以用多种方法来计算。有关详细信息,请参阅 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/math/matrix-exponentials.html">矩阵指数</a>。</p>
<p><strong>处理较小的数字</strong></p>
<p>对于非常小的 <em>x</em> 值,MATLAB 函数 <code>log1p</code> 和 <code>expm1</code> 可以精确计算 log(1+<em>x</em>) 和 <em>e**x</em>−1。例如,如果您尝试将小于计算机精度的一个数与 1 相加,则结果会舍入到 1。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">log</span>(<span class="number">1</span>+<span class="built_in">eps</span>/<span class="number">2</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure>
<p>但是,<code>log1p</code> 能够返回更准确的答案。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">log1p</span>(<span class="built_in">eps</span>/<span class="number">2</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">1.1102e-16</span></span><br></pre></td></tr></table></figure>
<p>同样,对于 <em>e**x</em>−1,如果 <em>x</em> 非常小,则会将它舍入为零。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exp</span>(<span class="built_in">eps</span>/<span class="number">2</span>)<span class="number">-1</span></span><br><span class="line"><span class="built_in">ans</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure>
<p>同样,<code>expm1</code> 能够返回更准确的答案。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">expm1</span>(<span class="built_in">eps</span>/<span class="number">2</span>)</span><br><span class="line"><span class="built_in">ans</span> = <span class="number">1.1102e-16</span></span><br></pre></td></tr></table></figure>
<h4 id="另请参阅-2"><a href="#另请参阅-2" class="headerlink" title="另请参阅"></a>另请参阅</h4><p><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/exp.html"><code>exp</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/expm.html"><code>expm</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/expm1.html"><code>expm1</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/power.html"><code>power</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/mpower.html"><code>mpower</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/sqrt.html"><code>sqrt</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/sqrtm.html"><code>sqrtm</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/nthroot.html"><code>nthroot</code></a></p>
<h4 id="相关主题-3"><a href="#相关主题-3" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-988203">MATLAB 环境中的矩阵</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/math/matrix-exponentials.html">矩阵指数</a></li>
</ul>
<h3 id="5-特征值"><a href="#5-特征值" class="headerlink" title="5. 特征值"></a>5. 特征值</h3><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2864">特征值的分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-965809">多重特征值</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-960177">Schur 分解</a></li>
</ul>
<h4 id="特征值的分解"><a href="#特征值的分解" class="headerlink" title="特征值的分解"></a>特征值的分解</h4><p>方阵 A 的<em>特征值</em>和<em>特征向量</em>分别为满足以下条件的标量 λ 和非零向量 υ</p>
<p>Aυ = λυ。</p>
<p>对于对角矩阵的对角线上的特征值 Λ 以及构成矩阵列的对应特征向量 V,公式为</p>
<p>AV = VΛ。</p>
<p>如果 V 是非奇异的,这将变为特征值分解。</p>
<p>A = VΛV–1。</p>
<p>微分方程 dx/dt = Ax 的系数矩阵就是一个很好的示例:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">A =</span><br><span class="line"> <span class="number">0</span> <span class="number">-6</span> <span class="number">-1</span></span><br><span class="line"> <span class="number">6</span> <span class="number">2</span> <span class="number">-16</span></span><br><span class="line"> <span class="number">-5</span> <span class="number">20</span> <span class="number">-10</span></span><br></pre></td></tr></table></figure>
<p>此方程的解用矩阵指数 x(t) = etAx(0) 表示。语句</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lambda = eig(A)</span><br></pre></td></tr></table></figure>
<p>生成包含 <code>A</code> 的特征值的列向量。对于该矩阵,这些特征值为复数:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">lambda =</span><br><span class="line"> <span class="number">-3.0710</span> </span><br><span class="line"> <span class="number">-2.4645</span>+<span class="number">17.6008</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">-2.4645</span><span class="number">-17.6008</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<p>每个特征值的实部都为负数,因此随着 t 的增加,eλt 将会接近零。两个特征值 ±ω 的非零虚部为微分方程的解提供了振动分量 sin(ωt)。</p>
<p>使用这两个输出参数,<code>eig</code> 便可以计算特征向量并将特征值存储在对角矩阵中:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[V,D] = eig(A)</span><br><span class="line">V =</span><br><span class="line"> <span class="number">-0.8326</span> <span class="number">0.2003</span> - <span class="number">0.1394</span><span class="built_in">i</span> <span class="number">0.2003</span> + <span class="number">0.1394</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">-0.3553</span> <span class="number">-0.2110</span> - <span class="number">0.6447</span><span class="built_in">i</span> <span class="number">-0.2110</span> + <span class="number">0.6447</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">-0.4248</span> <span class="number">-0.6930</span> <span class="number">-0.6930</span> </span><br><span class="line"></span><br><span class="line">D =</span><br><span class="line"> <span class="number">-3.0710</span> <span class="number">0</span> <span class="number">0</span> </span><br><span class="line"> <span class="number">0</span> <span class="number">-2.4645</span>+<span class="number">17.6008</span><span class="built_in">i</span> <span class="number">0</span> </span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">-2.4645</span><span class="number">-17.6008</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<p>第一个特征向量为实数,另外两个向量互为共轭复数。所有三个向量都归一化为具有等于 1 的欧几里德长度 <code>norm(v,2)</code>。</p>
<p>矩阵 <code>V*D*inv(V)</code>(可更简洁地写为 <code>V*D/V</code>)位于 <code>A</code> 的舍入误差界限内。<code>inv(V)*A*V</code> 或 <code>V\A*V</code> 都在 <code>D</code> 的舍入误差界限内。</p>
<h4 id="多重特征值"><a href="#多重特征值" class="headerlink" title="多重特征值"></a>多重特征值</h4><p>某些矩阵没有特征向量分解。这些矩阵是不可对角化的。例如:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">A = [ <span class="number">1</span> <span class="number">-2</span> <span class="number">1</span> </span><br><span class="line"> <span class="number">0</span> <span class="number">1</span> <span class="number">4</span> </span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">3</span> ]</span><br></pre></td></tr></table></figure>
<p>对于此矩阵</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[V,D] = eig(A)</span><br></pre></td></tr></table></figure>
<p>生成</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">V =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> <span class="number">1.0000</span> <span class="number">-0.5571</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0.0000</span> <span class="number">0.7428</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">0.3714</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">D =</span><br><span class="line"></span><br><span class="line"> <span class="number">1</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">1</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span> <span class="number">3</span></span><br></pre></td></tr></table></figure>
<p>λ =1 时有一个双精度特征值。<code>V</code> 的第一列和第二列相同。对于此矩阵,并不存在一组完整的线性无关特征向量。</p>
<h4 id="Schur-分解"><a href="#Schur-分解" class="headerlink" title="Schur 分解"></a>Schur 分解</h4><p>许多高级矩阵计算不需要进行特征值分解。而是使用 Schur 分解。</p>
<p>A = USU ′ ,</p>
<p>其中,U 是正交矩阵,S 是对角线上为 1×1 和 2×2 块的块上三角矩阵。特征值是通过 S 的对角元素和块显示的,而 U 的列提供了正交基,它的数值属性要远远优于一组特征向量。</p>
<p>例如,比较下面的亏损矩阵的特征值和 Schur 分解:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">A = [ <span class="number">6</span> <span class="number">12</span> <span class="number">19</span> </span><br><span class="line"> <span class="number">-9</span> <span class="number">-20</span> <span class="number">-33</span> </span><br><span class="line"> <span class="number">4</span> <span class="number">9</span> <span class="number">15</span> ];</span><br><span class="line"></span><br><span class="line">[V,D] = eig(A)</span><br><span class="line">V =</span><br><span class="line"></span><br><span class="line"> <span class="number">-0.4741</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">-0.4082</span> - <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">-0.4082</span> + <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">0.8127</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.8165</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.8165</span> + <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">-0.3386</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">-0.4082</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">-0.4082</span> - <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">D =</span><br><span class="line"></span><br><span class="line"> <span class="number">-1.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">1.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">0.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span> <span class="number">1.0000</span> - <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line">[U,S] = schur(A)</span><br><span class="line">U =</span><br><span class="line"></span><br><span class="line"> <span class="number">-0.4741</span> <span class="number">0.6648</span> <span class="number">0.5774</span></span><br><span class="line"> <span class="number">0.8127</span> <span class="number">0.0782</span> <span class="number">0.5774</span></span><br><span class="line"> <span class="number">-0.3386</span> <span class="number">-0.7430</span> <span class="number">0.5774</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">S =</span><br><span class="line"></span><br><span class="line"> <span class="number">-1.0000</span> <span class="number">20.7846</span> <span class="number">-44.6948</span></span><br><span class="line"> <span class="number">0</span> <span class="number">1.0000</span> <span class="number">-0.6096</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0.0000</span> <span class="number">1.0000</span></span><br></pre></td></tr></table></figure>
<p>矩阵 <code>A</code> 为亏损矩阵,因为它不具备一组完整的线性无关特征向量(<code>V</code> 的第二列和第三列相同)。由于 <code>V</code> 的列并非全部是线性无关的,因此它有一个很大的条件数,大约为 <code>1e8</code>。但 <code>schur</code> 可以计算 <code>U</code> 中的三个不同基向量。由于 <code>U</code> 是正交矩阵,因此 <code>cond(U) = 1</code>。</p>
<p>矩阵 <code>S</code> 的实数特征值作为对角线上的第一个条目,并通过右下方的 2×2 块表示重复的特征值。2×2 块的特征值也是 <code>A</code> 的特征值:</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">eig(S(<span class="number">2</span>:<span class="number">3</span>,<span class="number">2</span>:<span class="number">3</span>))</span><br><span class="line"><span class="built_in">ans</span> =</span><br><span class="line"></span><br><span class="line"> <span class="number">1.0000</span> + <span class="number">0.0000</span><span class="built_in">i</span></span><br><span class="line"> <span class="number">1.0000</span> - <span class="number">0.0000</span><span class="built_in">i</span></span><br></pre></td></tr></table></figure>
<h4 id="另请参阅-3"><a href="#另请参阅-3" class="headerlink" title="另请参阅"></a>另请参阅</h4><p><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/eig.html"><code>eig</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/schur.html"><code>schur</code></a></p>
<h4 id="相关主题-4"><a href="#相关主题-4" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-988203">MATLAB 环境中的矩阵</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2418">分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-960721">奇异值</a></li>
</ul>
<h3 id="6-奇异值"><a href="#6-奇异值" class="headerlink" title="6. 奇异值"></a>6. 奇异值</h3><p>矩形矩阵 A 的<em>奇异值</em>和对应的<em>奇异向量</em>分别为满足以下条件的标量 σ 以及一对向量 u 和 v</p>
<p><em>A**v</em>=<em>σ<strong>u</strong>A<strong>H</strong>u</em>=<em>σ**v</em>,</p>
<p>其中 <em>A**H</em> 是 A 的 Hermitian 转置。奇异向量 u 和 v 通常缩放至范数为 1。此外,如果 u 和 v 均为 A 的奇异向量,则 -u 和 -v 也为 <code>A</code> 的奇异向量。</p>
<p>奇异值 σ 始终为非负实数,即使 A 为复数也是如此。对于对角矩阵 Σ 中的奇异值以及构成两个正交矩阵 U 和 V 的列的对应奇异向量,方程为</p>
<p><em>A**V</em>=<em>U</em>Σ<em>A<strong>H</strong>U</em>=<em>V</em>Σ.</p>
<p>由于 U 和 V 均为单位矩阵,因此将第一个方程的右侧乘以 <em>V**H</em> 会生成奇异值分解方程</p>
<p><em>A</em>=<em>U</em>Σ<em>V**H</em>.</p>
<p>m×n 矩阵的完整奇异值分解涉及:</p>
<ul>
<li>m×m 矩阵 U</li>
<li>m×n 矩阵 Σ</li>
<li>n×n 矩阵 V</li>
</ul>
<p>换句话说,U 和 V 均为方阵,Σ 与 A 的大小相同。如果 A 的行数远多于列数 (<code>m > n</code>),则得到的 <code>m</code>×<code>m</code> 矩阵 U 为大型矩阵。但是,U 中的大多数列与 Σ 中的零相乘。在这种情况下,<em>精简</em>分解可通过生成一个 m×n U、一个 n×n Σ 以及相同的 V 来同时节省时间和存储空间:</p>
<p><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207231643210.png" alt="In the economy-sized decomposition, columns in U can be ignored if they multiply zeros in the diagonal matrix of singular values."></p>
<p>特征值分解是分析矩阵(当矩形表示从向量空间到其自身的映射时)的合适工具,就像分析常微分方程一样。但是,奇异值分解是分析从一个向量空间到另一个向量空间(可能具有不同的维度)的映射的合适工具。大多数联立线性方程组都属于这第二类。</p>
<p>如果 A 是方形的对称正定矩阵,则其特征值分解和奇异值分解相同。但是,当 A 偏离对称性和正定性时,这两种分解之间的差异就会增加。特别是,实矩阵的奇异值分解始终为实数,但非对称实矩阵的特征值分解可能为复数。</p>
<p>对于示例矩阵</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">A =</span><br><span class="line"> <span class="number">9</span> <span class="number">4</span></span><br><span class="line"> <span class="number">6</span> <span class="number">8</span></span><br><span class="line"> <span class="number">2</span> <span class="number">7</span></span><br></pre></td></tr></table></figure>
<p>完整的奇异值分解为</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">[U,S,V] = svd(A)</span><br><span class="line"></span><br><span class="line">U =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6105</span> <span class="number">-0.7174</span> <span class="number">0.3355</span></span><br><span class="line"> <span class="number">0.6646</span> <span class="number">0.2336</span> <span class="number">-0.7098</span></span><br><span class="line"> <span class="number">0.4308</span> <span class="number">0.6563</span> <span class="number">0.6194</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">S =</span><br><span class="line"></span><br><span class="line"> <span class="number">14.9359</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">5.1883</span></span><br><span class="line"> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">V =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6925</span> <span class="number">-0.7214</span></span><br><span class="line"> <span class="number">0.7214</span> <span class="number">0.6925</span></span><br></pre></td></tr></table></figure>
<p>可以验证 <code>U*S*V'</code> 在舍入误差界限内是否等于 <code>A</code>。对于此类小问题,精简分解只是略小一些。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">[U,S,V] = svd(A,<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">U =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6105</span> <span class="number">-0.7174</span></span><br><span class="line"> <span class="number">0.6646</span> <span class="number">0.2336</span></span><br><span class="line"> <span class="number">0.4308</span> <span class="number">0.6563</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">S =</span><br><span class="line"></span><br><span class="line"> <span class="number">14.9359</span> <span class="number">0</span></span><br><span class="line"> <span class="number">0</span> <span class="number">5.1883</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">V =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.6925</span> <span class="number">-0.7214</span></span><br><span class="line"> <span class="number">0.7214</span> <span class="number">0.6925</span></span><br></pre></td></tr></table></figure>
<p>同样,<code>U*S*V'</code> 在舍入误差界限内等于 <code>A</code>。</p>
<h4 id="分批-SVD-计算"><a href="#分批-SVD-计算" class="headerlink" title="分批 SVD 计算"></a>分批 SVD 计算</h4><p>如果需要分解一个由大小相同的矩阵组成的大型矩阵集合,则用 <code>svd</code> 在循环中执行所有分解是低效的。在这种情况下,您可以将所有矩阵串联成一个多维数组,并使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/pagesvd.html"><code>pagesvd</code></a> 通过一次函数调用对所有数组页执行奇异值分解。</p>
<table>
<thead>
<tr>
<th align="left">函数</th>
<th align="left">用法</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/pagesvd.html"><code>pagesvd</code></a></td>
<td align="left">使用 <code>pagesvd</code> 对多维数组的页执行奇异值分解。这是对大小相同的矩阵组成的大型集合执行 SVD 的高效方法。</td>
</tr>
</tbody></table>
<p>例如,假设有一个包含三个 2×2 矩阵的集合。使用 <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/double.cat.html"><code>cat</code></a> 函数将这些矩阵串联成一个 2×2×3 数组。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">A = [<span class="number">0</span> <span class="number">-1</span>; <span class="number">1</span> <span class="number">0</span>];</span><br><span class="line">B = [<span class="number">-1</span> <span class="number">0</span>; <span class="number">0</span> <span class="number">-1</span>];</span><br><span class="line">C = [<span class="number">0</span> <span class="number">1</span>; <span class="number">-1</span> <span class="number">0</span>];</span><br><span class="line">X = <span class="built_in">cat</span>(<span class="number">3</span>,A,B,C);</span><br></pre></td></tr></table></figure>
<p>现在,使用 <code>pagesvd</code> 同时执行三个分解。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[U,S,V] = pagesvd(X);</span><br></pre></td></tr></table></figure>
<p>对于 <code>X</code> 的每页,输出 <code>U</code>、<code>S</code> 和 <code>V</code> 中都有对应的页。例如,矩阵 <code>A</code> 位于 <code>X</code> 的第一页上,其分解由 <code>U(:,:,1)*S(:,:,1)*V(:,:,1)'</code> 给出。</p>
<h4 id="低秩-SVD-逼近"><a href="#低秩-SVD-逼近" class="headerlink" title="低秩 SVD 逼近"></a>低秩 SVD 逼近</h4><p>对于大型稀疏矩阵,使用 <code>svd</code> 计算<em>所有</em>奇异值和奇异向量并不始终可行。例如,如果您只需知道几个最大的奇异值,那么计算一个 5000×5000 稀疏矩阵的所有奇异值会带来额外的工作。</p>
<p>在只需要一部分奇异值和奇异向量的情况下,<code>svds</code> 和 <code>svdsketch</code> 函数优先于 <code>svd</code>。</p>
<table>
<thead>
<tr>
<th align="left">函数</th>
<th align="left">用法</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/svds.html"><code>svds</code></a></td>
<td align="left">使用 <code>svds</code> 计算 SVD 的 k 秩逼近。您可以指定一部分奇异值应为最大值、最小值还是最接近特定数字的值。<code>svds</code> 通常计算最可能的 k 秩逼近。</td>
</tr>
<tr>
<td align="left"><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/svdsketch.html"><code>svdsketch</code></a></td>
<td align="left">使用 <code>svdsketch</code> 计算输入矩阵的满足指定容差的部分 SVD。<code>svds</code> 要求您指定秩,而 <code>svdsketch</code> 根据指定的容差以自适应方式确定矩阵草图的秩。<code>svdsketch</code> 最终使用的 k 秩逼近满足容差,但不同于 <code>svds</code>,它无法保证是最佳的。</td>
</tr>
</tbody></table>
<p>例如,假设有一个密度约为 30% 的 1000×1000 随机稀疏矩阵。</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">n = <span class="number">1000</span>;</span><br><span class="line">A = sprand(n,n,<span class="number">0.3</span>);</span><br></pre></td></tr></table></figure>
<p>最大的六个奇异值为</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">S = svds(A)</span><br><span class="line"></span><br><span class="line">S =</span><br><span class="line"></span><br><span class="line"> <span class="number">130.2184</span></span><br><span class="line"> <span class="number">16.4358</span></span><br><span class="line"> <span class="number">16.4119</span></span><br><span class="line"> <span class="number">16.3688</span></span><br><span class="line"> <span class="number">16.3242</span></span><br><span class="line"> <span class="number">16.2838</span></span><br></pre></td></tr></table></figure>
<p>此外,最小的六个奇异值为</p>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">S = svds(A,<span class="number">6</span>,<span class="string">'smallest'</span>)</span><br><span class="line"></span><br><span class="line">S =</span><br><span class="line"></span><br><span class="line"> <span class="number">0.0740</span></span><br><span class="line"> <span class="number">0.0574</span></span><br><span class="line"> <span class="number">0.0388</span></span><br><span class="line"> <span class="number">0.0282</span></span><br><span class="line"> <span class="number">0.0131</span></span><br><span class="line"> <span class="number">0.0066</span></span><br></pre></td></tr></table></figure>
<p>对于可作为满矩阵 <code>full(A)</code> 载入内存的较小矩阵,使用 <code>svd(full(A))</code> 的速度可能仍快于使用 <code>svds</code> 或 <code>svdsketch</code>。但对于确实很大的稀疏矩阵,就有必要使用 <code>svds</code> 或 <code>svdsketch</code>。</p>
<h4 id="另请参阅-4"><a href="#另请参阅-4" class="headerlink" title="另请参阅"></a>另请参阅</h4><p><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/double.svd.html"><code>svd</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/svds.html"><code>svds</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/svdsketch.html"><code>svdsketch</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/gsvd.html"><code>gsvd</code></a> | <a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/ref/pagesvd.html"><code>pagesvd</code></a></p>
<h4 id="相关主题-5"><a href="#相关主题-5" class="headerlink" title="相关主题"></a>相关主题</h4><ul>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-988203">MATLAB 环境中的矩阵</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2418">分解</a></li>
<li><a target="_blank" rel="noopener" href="https://ww2.mathworks.cn/help/matlab/learn_matlab/linear-algebra.html#f4-2852">特征值</a></li>
</ul>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="mailto:undefined">magic-H</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://magic-h.top/29565.html">https://magic-h.top/29565.html</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://magic-H.top" target="_blank">magic-H</a>!</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/MATLAB/">MATLAB</a></div><div class="post_share"><div class="social-share" data-image="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share.js/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/social-share.js/dist/js/social-share.min.js" defer></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/45507.html"><img class="prev-cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">MATLAB快速入门(四)</div></div></a></div><div class="next-post pull-right"><a href="/57090.html"><img class="next-cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">MATLAB快速入门(三)</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>相关推荐</span></div><div class="relatedPosts-list"><div><a href="/17153.html" title="MATLAB快速入门(一)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-20</div><div class="title">MATLAB快速入门(一)</div></div></a></div><div><a href="/54139.html" title="MATLAB快速入门(二)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-21</div><div class="title">MATLAB快速入门(二)</div></div></a></div><div><a href="/57090.html" title="MATLAB快速入门(三)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-22</div><div class="title">MATLAB快速入门(三)</div></div></a></div><div><a href="/15204.html" title="MATLAB快速入门(六)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-23</div><div class="title">MATLAB快速入门(六)</div></div></a></div><div><a href="/45507.html" title="MATLAB快速入门(四)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-23</div><div class="title">MATLAB快速入门(四)</div></div></a></div><div><a href="/1793.html" title="MATLAB快速入门(七)"><img class="cover" src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207211037802.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-24</div><div class="title">MATLAB快速入门(七)</div></div></a></div></div></div><hr/><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div></div><div class="comment-wrap"><div><div id="waline-wrap"></div></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://s4.ax1x.com/2022/02/18/HT4dgI.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">magic-H</div><div class="author-info__description"></div></div><div class="card-info-data is-center"><div class="card-info-data-item"><a href="/archives/"><div class="headline">文章</div><div class="length-num">21</div></a></div><div class="card-info-data-item"><a href="/tags/"><div class="headline">标签</div><div class="length-num">9</div></a></div><div class="card-info-data-item"><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/magic-H728"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/magic-H728" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">This is my Blog</div></div><div class="card-widget"><div class="item-headline"><i></i><span></span></div><div class="item-content"></div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E4%B8%80-%E7%AE%80%E4%BB%8B"><span class="toc-text">一.简介</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E4%BA%8C-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%EF%BC%88%E4%BA%94%EF%BC%89%EF%BC%88%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%EF%BC%89"><span class="toc-text">二. 快速入门(五)(线性代数)</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-MATLAB-%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84%E7%9F%A9%E9%98%B5"><span class="toc-text">1. MATLAB 环境中的矩阵</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%88%9B%E5%BB%BA%E7%9F%A9%E9%98%B5"><span class="toc-text">创建矩阵</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9F%A9%E9%98%B5%E7%9A%84%E5%8A%A0%E6%B3%95%E5%92%8C%E5%87%8F%E6%B3%95"><span class="toc-text">矩阵的加法和减法</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%90%91%E9%87%8F%E4%B9%98%E7%A7%AF%E5%92%8C%E8%BD%AC%E7%BD%AE"><span class="toc-text">向量乘积和转置</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95"><span class="toc-text">矩阵乘法</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8D%95%E4%BD%8D%E7%9F%A9%E9%98%B5"><span class="toc-text">单位矩阵</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9F%A9%E9%98%B5%E6%B1%82%E9%80%86"><span class="toc-text">矩阵求逆</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Kronecker-%E5%BC%A0%E9%87%8F%E7%A7%AF"><span class="toc-text">Kronecker 张量积</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%90%91%E9%87%8F%E8%8C%83%E6%95%B0%E5%92%8C%E7%9F%A9%E9%98%B5%E8%8C%83%E6%95%B0"><span class="toc-text">向量范数和矩阵范数</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E4%BD%BF%E7%94%A8%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E6%96%B9%E7%A8%8B%E5%87%BD%E6%95%B0%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97"><span class="toc-text">使用线性代数方程函数的多线程计算</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98"><span class="toc-text">相关主题</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-%E7%BA%BF%E6%80%A7%E6%96%B9%E7%A8%8B%E7%BB%84"><span class="toc-text">2. 线性方程组</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E8%AE%A1%E7%AE%97%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9"><span class="toc-text">计算注意事项</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E9%80%9A%E8%A7%A3"><span class="toc-text">通解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E6%96%B9%E9%98%B5%E6%96%B9%E7%A8%8B%E7%BB%84"><span class="toc-text">方阵方程组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E8%B6%85%E5%AE%9A%E6%96%B9%E7%A8%8B%E7%BB%84"><span class="toc-text">超定方程组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E6%AC%A0%E5%AE%9A%E6%96%B9%E7%A8%8B%E7%BB%84"><span class="toc-text">欠定方程组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%A4%9A%E5%8F%B3%E7%AB%AF%E7%BA%BF%E6%80%A7%E6%96%B9%E7%A8%8B%E7%BB%84%E7%9A%84%E6%B1%82%E8%A7%A3"><span class="toc-text">多右端线性方程组的求解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E8%BF%AD%E4%BB%A3%E6%B3%95"><span class="toc-text">迭代法</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97"><span class="toc-text">多线程计算</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85"><span class="toc-text">另请参阅</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98-1"><span class="toc-text">相关主题</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-%E5%88%86%E8%A7%A3"><span class="toc-text">3. 分解</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%AE%80%E4%BB%8B"><span class="toc-text">简介</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Cholesky-%E5%88%86%E8%A7%A3"><span class="toc-text">Cholesky 分解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#LU-%E5%88%86%E8%A7%A3"><span class="toc-text">LU 分解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#QR-%E5%88%86%E8%A7%A3"><span class="toc-text">QR 分解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AF%B9%E5%88%86%E8%A7%A3%E4%BD%BF%E7%94%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97"><span class="toc-text">对分解使用多线程计算</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85-1"><span class="toc-text">另请参阅</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98-2"><span class="toc-text">相关主题</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4-%E5%B9%82%E5%92%8C%E6%8C%87%E6%95%B0"><span class="toc-text">4. 幂和指数</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85-2"><span class="toc-text">另请参阅</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98-3"><span class="toc-text">相关主题</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-%E7%89%B9%E5%BE%81%E5%80%BC"><span class="toc-text">5. 特征值</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%89%B9%E5%BE%81%E5%80%BC%E7%9A%84%E5%88%86%E8%A7%A3"><span class="toc-text">特征值的分解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%A4%9A%E9%87%8D%E7%89%B9%E5%BE%81%E5%80%BC"><span class="toc-text">多重特征值</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Schur-%E5%88%86%E8%A7%A3"><span class="toc-text">Schur 分解</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85-3"><span class="toc-text">另请参阅</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98-4"><span class="toc-text">相关主题</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-%E5%A5%87%E5%BC%82%E5%80%BC"><span class="toc-text">6. 奇异值</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%88%86%E6%89%B9-SVD-%E8%AE%A1%E7%AE%97"><span class="toc-text">分批 SVD 计算</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E4%BD%8E%E7%A7%A9-SVD-%E9%80%BC%E8%BF%91"><span class="toc-text">低秩 SVD 逼近</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85-4"><span class="toc-text">另请参阅</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%9B%B8%E5%85%B3%E4%B8%BB%E9%A2%98-5"><span class="toc-text">相关主题</span></a></li></ol></li></ol></li></ol></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/25737.html" title="数据结构OJ"><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202301131413619.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="数据结构OJ"/></a><div class="content"><a class="title" href="/25737.html" title="数据结构OJ">数据结构OJ</a><time datetime="2023-01-13T00:00:00.000Z" title="发表于 2023-01-13 00:00:00">2023-01-13</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/48665.html" title="Notion知识体系管理工具"><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207311705467.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Notion知识体系管理工具"/></a><div class="content"><a class="title" href="/48665.html" title="Notion知识体系管理工具">Notion知识体系管理工具</a><time datetime="2022-07-31T00:00:00.000Z" title="发表于 2022-07-31 00:00:00">2022-07-31</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2567.html" title="Java刷题笔记(三)"><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207291555693.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Java刷题笔记(三)"/></a><div class="content"><a class="title" href="/2567.html" title="Java刷题笔记(三)">Java刷题笔记(三)</a><time datetime="2022-07-30T00:00:00.000Z" title="发表于 2022-07-30 00:00:00">2022-07-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/62779.html" title="Java刷题笔记(二)"><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207291555693.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Java刷题笔记(二)"/></a><div class="content"><a class="title" href="/62779.html" title="Java刷题笔记(二)">Java刷题笔记(二)</a><time datetime="2022-07-29T00:00:00.000Z" title="发表于 2022-07-29 00:00:00">2022-07-29</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/64644.html" title="线性表(下)"><img src="https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207261740136.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="线性表(下)"/></a><div class="content"><a class="title" href="/64644.html" title="线性表(下)">线性表(下)</a><time datetime="2022-07-28T00:00:00.000Z" title="发表于 2022-07-28 00:00:00">2022-07-28</time></div></div></div></div></div></div></main><footer id="footer" style="background-image: url('https://testingcf.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207182124785.png')"><div id="footer-wrap"><div class="copyright">©2022 - 2023 By magic-H</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><img src="https://gcore.jsdelivr.net/gh/magic-H728/Store@master/blog-img/202207181316087.png">
<a href="http://www.beian.miit.gov.cn/" style="color:#f72b07" target="_blank">粤ICP备2022027428号</a><div class="footer_custom_text">Hi, welcome to my <a href="magic-h.top">blog</a>!</div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="fas fa-comments"></i></a><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">本地搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span> 数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div id="local-search-results"></div></div></div><div id="search-mask"></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/medium-zoom/dist/medium-zoom.min.js"></script><script src="https://cdn.jsdelivr.net/npm/instant.page/instantpage.min.js" type="module"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script>function panguFn () {
if (typeof pangu === 'object') pangu.autoSpacingPage()
else {
getScript('https://cdn.jsdelivr.net/npm/pangu/dist/browser/pangu.min.js')
.then(() => {
pangu.autoSpacingPage()
})
}
}
function panguInit () {
if (false){
GLOBAL_CONFIG_SITE.isPost && panguFn()
} else {
panguFn()
}
}
document.addEventListener('DOMContentLoaded', panguInit)</script><script src="/js/search/local-search.js"></script><div class="js-pjax"><script>(() => {
const $mermaidWrap = document.querySelectorAll('#article-container .mermaid-wrap')
if ($mermaidWrap.length) {
window.runMermaid = () => {
window.loadMermaid = true
const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'default'
Array.from($mermaidWrap).forEach((item, index) => {
const mermaidSrc = item.firstElementChild
const mermaidThemeConfig = '%%{init:{ \'theme\':\'' + theme + '\'}}%%\n'
const mermaidID = 'mermaid-' + index
const mermaidDefinition = mermaidThemeConfig + mermaidSrc.textContent
mermaid.mermaidAPI.render(mermaidID, mermaidDefinition, (svgCode) => {
mermaidSrc.insertAdjacentHTML('afterend', svgCode)
})
})
}
const loadMermaid = () => {
window.loadMermaid ? runMermaid() : getScript('https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js').then(runMermaid)
}
window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid)
}
})()</script><script>function loadWaline () {
function initWaline () {
const waline = new Waline(Object.assign({
el: '#waline-wrap',
serverURL: 'https://magic-h-mr0qem8oh-magic-h728.vercel.app/',
path: location.pathname,
visitor: false,
dark: 'html[data-theme="dark"]'
}, null))
}
if (typeof Waline === 'function') initWaline()
else getScript('https://cdn.jsdelivr.net/npm/@waline/client/dist/Waline.min.js').then(initWaline)
}
if ('Waline' === 'Waline' || !false) {
if (false) btf.loadComment(document.getElementById('waline-wrap'),loadWaline)
else setTimeout(loadWaline, 0)
} else {
function loadOtherComment () {
loadWaline()
}
}</script></div><canvas class="fireworks" mobile="false"></canvas><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/fireworks.min.js"></script><script defer="defer" id="fluttering_ribbon" mobile="true" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js"></script><script id="canvas_nest" defer="defer" color="200,100,255" opacity="0.7" zIndex="-1" count="118" mobile="true" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/activate-power-mode.min.js"></script><script>POWERMODE.colorful = true;
POWERMODE.shake = false;
POWERMODE.mobile = false;
document.body.addEventListener('input', POWERMODE);
</script><script src="https://cdn.jsdelivr.net/npm/pjax/pjax.min.js"></script><script>let pjaxSelectors = ["title","#config-diff","#body-wrap","#rightside-config-hide","#rightside-config-show",".js-pjax"]
var pjax = new Pjax({
elements: 'a:not([target="_blank"]):not([href="/music/"]):not([href="/no-pjax/"])',
selectors: pjaxSelectors,
cacheBust: false,
analytics: false,
scrollRestoration: false
})
document.addEventListener('pjax:send', function () {
// removeEventListener scroll
window.tocScrollFn && window.removeEventListener('scroll', window.tocScrollFn)
window.scrollCollect && window.removeEventListener('scroll', scrollCollect)
typeof preloader === 'object' && preloader.initLoading()
document.getElementById('rightside').style.cssText = "opacity: ''; transform: ''"
if (window.aplayers) {
for (let i = 0; i < window.aplayers.length; i++) {
if (!window.aplayers[i].options.fixed) {
window.aplayers[i].destroy()
}
}
}
typeof typed === 'object' && typed.destroy()
//reset readmode
const $bodyClassList = document.body.classList
$bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode')
})
document.addEventListener('pjax:complete', function () {
window.refreshFn()
document.querySelectorAll('script[data-pjax]').forEach(item => {
const newScript = document.createElement('script')
const content = item.text || item.textContent || item.innerHTML || ""
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
newScript.appendChild(document.createTextNode(content))
item.parentNode.replaceChild(newScript, item)
})
GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update()
typeof chatBtnFn === 'function' && chatBtnFn()
typeof panguInit === 'function' && panguInit()
// google analytics
typeof gtag === 'function' && gtag('config', '', {'page_path': window.location.pathname});
// baidu analytics
typeof _hmt === 'object' && _hmt.push(['_trackPageview',window.location.pathname]);
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
// prismjs
typeof Prism === 'object' && Prism.highlightAll()
typeof preloader === 'object' && preloader.endLoading()
})
document.addEventListener('pjax:error', (e) => {
if (e.request.status === 404) {
pjax.loadUrl('/404.html')
}
})</script></div></body></html>