Pitambar Dayal, MathWorks
学习如何使用MATLAB在for循环中创建具有底层模式的矩阵®,以及如何为相同的进程使用预分配。
大家好,欢迎回到另一个MATLAB视频。今天,我们将讨论如何在循环中创建一个矩阵。我们将通过回答几个问题来做到这一点。
这是第一个问题。假设有一个向量1 3 6 8 9。我想从它得到下面的矩阵,这个矩阵。我该怎么做呢?
如果我们仔细观察这个矩阵,我们可以看到一个模式。每一行的值等于1加上它上面的值。看,第一列是1 2 3 4 5。第二列是3,4,5,6,7,等等,等等。
现在我们找到了模式,问题是,我们如何在循环中创建这个矩阵?第一步是创建初始向量。我写a等于1 3 6 8 9。在这个例子中,我不打算抑制输出。在视频的最后我会告诉你们为什么。
现在我们有了向量,我们需要考虑如何在循环中创建矩阵。我们知道我们需要向当前向量追加4行。这意味着我们需要在循环中进行四次迭代。我将继续创建I从2到5的索引变量。然后在循环内部,我将写入以下命令:A (I) comma: = A (I - 1) comma: + 1,然后结束。
让我们看一下这个表述。我们进入循环,i等于2。A (I,逗号:)表示我们要索引第I行中的所有列,在这里是第2行。第二部分,等于A (I - 1,冒号+ 1)意味着我们设第二行等于1加上它前面一行的值,在这里是第一行,然后结束。经过一次迭代,A现在是一个2 × 5矩阵。
我们回到循环的顶端。这次,I等于3。我们索引第三行中的所有列,并将这些值设为1加上它上面的行。结果是A是一个3 × 5矩阵。我们会继续遍历循环直到我们遍历了所有的索引变量。
现在,让我们看看当我们点击Run时会发生什么。如我们所见,我们得到了我们期待的矩阵。由于我们没有抑制语句,所以我们也可以看到每个迭代。
我们来做一个稍微不同的例子。这次,我们从这个列向量开始。我们想要得到下面的矩阵。我们要怎么做呢?
第一步是找出规律。在本例中,每一列的值都是前一列值的两倍。就像之前一样,我们来创建初始向量B,这一次,我们在B后面再加三列。
当我们建立循环时,我们会说,for I = 2:4。接下来是用MATLAB代码编写模式。我写B(冒号,I) = 2乘以B(冒号,I - 1)然后结束。如果我们运行这个,我们应该得到我们期望的矩阵。我们做到了。现在,我只想说我提供的解是非唯一的。你可能会想出一些稍微不同的东西,但仍然有效。
现在,你们中的一些人可能会指出如果我们预先分配内存这个过程会更快。你们是对的。预分配是一种通过显式定义增长数组或增长矩阵的最终大小来优化MATLAB代码的方法。它可能不会影响我们当前示例的性能。因为矩阵很小。但是对于那些变得非常大的矩阵来说,这是值得注意的。
让我们在第一个例子中使用预分配。我们的代码看起来和之前非常相似,除了两行。第一行定义了最终矩阵的大小。在这种情况下,它是一个5 × 5的矩阵。我将创建一个0的占位符矩阵它的大小是这样的。
其余的代码几乎完全相同。我将继续从第一个例子中复制它并做一个小调整。在上面这里,我们需要索引到0矩阵的第一行用这个向量中包含的值覆盖这些值。但仅此而已。现在,如果我们点击运行,我们会看到A的大小没有增加,它只是覆盖了已经存在的行。
让我们回到第一个问题看一下矩阵是如何变得越来越大的。为了测试你对这个问题的理解,看看你是否可以将同样的方法应用到我们做的第二个问题上。不管怎样,感谢大家的收看。下个视频再见。