Matlab:数组
(一)基本运算与矩阵输入
1 创建数组
一维数组称为向量,二维数组称为矩阵
可以使用中括号“[
]”,直接输入数值来创建数组,也可以通过MATLAB内置函数来创建特殊数组
1.1 直接创建
元素间使用空格或者英文逗号间隔,使用英文分号执行换行操作
1 | >>A=[1 2 3;4 5 6;7 8 9] |
一、语法知识
1、循环控制语句:
1)for~end:用于要求重复多次执行for与end之间的程序语句。允许嵌套。其一般格式为
1 | for 变量 = 起始值 :增量 :终点 |
2)while~end:与c++类似,while也不规定循环次数,其终止时刻由while后面的条件表达式决定,若条件成立,则重复执行while与end之间的程序语句,否则结束循环。其一般格式为
1 | while 条件表达式 |
1)if~end:其一般格式为
1 | if 逻辑表达式 |
1 | if 逻辑表达式1 |
1 | 【注意:在多分支条件选择语句中,if和elseif是互相独立且互相排斥的条件选择语句,else后的语句执行的条件是先前所有的条件语句均不成立】 |
3)switch~end:开关语句是一种多分支条件选择语句,他执行特定选择语句,当且仅当变量或表达式的值相符。其一般格式为
1 | switch 表达式 |
for循环用来循环处理数据。
例:输出1~100的和
1 | >> clear |
解释:i从1到100,每次增加一个,该共循环100次
注意:分号的位置;不能使用“+=”符号;每写一层循环,必须以end结尾
例:输出1到10之间的奇数和
1 |
|
解释:i = 1:2:10中间的2表示步长,表示从1到10,每次增加2,即1,3,5,7,9五个数之和;步长也可以为负数
1 | >> clear |
解释:rand函数用于随机生成0~1之间的数,rand(1,4)生成1*4的列向量。
1 | >> A = magic(4); |
解释:magic(n)函数用于生成任意一行或一列或主副对角线之和相等的方阵,对矩阵的循环遍历是依次取出矩阵中的每一列元素
break用于终止离它最近的一层for循环;
continue用于跳过离它最近的一层for循环,接着执行下一次循环
1 | >> x = 1; |
1 | >> sum = 0; |
for循环可以按照需要进行嵌套。
1 | >> for i = 1:2:6 |
在 MATLAB 中,函数可以返回多个值。要返回多个值,可以使用中括号将它们括起来,并用逗号分隔。以下是一个简单的示例:
1 | function [output1, output2] = myFunction(input1, input2) |
在这个例子中,函数 myFunction
接受两个输入参数
input1
和 input2
,并返回两个输出值
output1
和 output2
。在函数的结尾处,使用
output1
和 output2
变量来存储要返回的值。
要调用这个函数并获取返回的值,可以使用以下语法:
1 | [output1, output2] = myFunction(input1, input2); |
这将调用函数 myFunction
并将输入参数 input1
和 input2
传递给它。函数将计算输出值 output1
和 output2
,并将它们分别赋值给变量 output1
和
output2
。
在 Matlab 中,可以通过在函数定义行中使用多个输入参数来实现函数接受多个输入。以下是一个简单的示例:
1 | function output = myFunc(input1, input2, input3) |
函数里的变量自在函数内有效, 那么如何在函数内调用外部的变量呢?
Warning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable.
并且需要在你写的函数里面声明使用全局变量。
1 | global x |
子函数默认可以调用其母函数中所有的变量
1 | function main |
执行 main, 输出5. 子函数共享父函数的变量
目录
1、vector对象的定义和初始化方式 2、vector 常用基础操作 3、使用迭代器的遍历、插入、删除操作
4、vector 元素的重排操作(排序、逆序等)
5、vector 中找最值
6、改变vector大小 及其 内存分配机制
7、vector数组 与 内置数组 的选择问题
常用的初始化方式及作用如下:
vector 中的数据类型 T 可以代表任何数据类型,如 int、string、class、vector(构建多维数组) 等,就像一个可以放下任何东西的容器,因此 vector 也常被称作容器。字符串类型 string 也是一种容器,c++ 中的不同种类的容器拥有很多相同的操作,因此 string 的很多操作方法可以直接用在 vector 中。
vector<T> v1 | v1 是一个元素类型为 T 的空 vector |
vector<T> v2(v1) | 使用 v2 中所有元素初始化 v1 |
vector<T> v2 = v1 | 同上 |
vector<T> v3(n, val) | v3 中包含了 n 个值为 val 的元素 |
vector<T> v4(n) | v3 中包含了 n 个默认值初始化的元素 |
vector<T> v5{a, b, c...} | 使用 a, b, c... 初始化 v5 |
vector<T> v1 | 同上 |
vector<vector<int>> matrix(M,vector<int>(N)); |
二维数组初始化 |
下表列出了 添加元素、查询、索引、赋值、比较 等常用操作方法。
v.empty() | 如果 v 为空则返回 true,否则返回 false |
v.size() | 返回 v 中元素的个数 |
v.push_back(val) |
向 vector 的尾端添加值为 val 的元素。 注意:vector 不支持 push_front 操作。 |
v.pop_back(val) |
删除尾元素,返回void。vector同样 不支持 pop_front 操作。若想在同时弹出元素的值,就必须在执行弹出之前保存它(可以使用 v.back())。 |
v[n] | 返回 v 中第 n 个位置上元素的引用,不能用下标操作添加元素 |
v.back() | 返回 v 中最后一个元素的引用 |
v.front() | 返回 v 中第一个元素的引用 |
v1 = v2 | 用 v2 中的元素替换 v1 中的元素 |
v1 = {a, b, c...} | 用元素 {a, b, c...} 替换 v1 中的元素 |
v1 == v2 | 当且仅当拥有相同数量且相同位置上值相同的元素时,v1 与 v2 相等 |
v1 != v2 | 自行体会 |
<, <=, >, >= | 以字典序进行比较 |
迭代器类似于指针,提供了对象的间接访问,但获取迭代器并不是使用取地址符。如果将指针理解为元素的“地址”,那么迭代器可以理解为元素的“位置”。可以使用迭代器访问某个元素,迭代器也能从一个元素移动到另一个元素。
一个迭代器的范围由一对迭代器表示,分别为 begin 和 end。其中 begin 成员返回指向第一个元素的迭代器;end 成员返回容器最后一个元素的下一个位置(one past the end),也就是指向一个根本不存在的尾后位置,这样的迭代器没什么实际含义,仅是个标记而已,表示已经处理完了容器中的所有元素。所以 begin 和 end 表示的是一个左闭右开的区间 [ begin , end)
迭代器可以用来实现容器的遍历、插入等操作,可以细品下面的例子:
1、遍历
1 | #include <iostream> |
2、插入
插入操作的函数:
v.insert(p, n, val) :在迭代器 p 之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。
1 | #include <iostream> |
3、删除
删除操作的函数:
v.erase(p) :删除迭代器 p 所指的元素,返回指向被删除元素之后元素的迭代器。
v.erase(b, e) :删除迭代器 b, e 之间的元素,返回指向最后一个被删除元素之后元素的迭代器。
1 | #include <iostream> |
容器的重排需要用到头文件 <algorithm>
中的算法
1、排序 sort()
使用到的函数为 sort() :按输入序列的字典序升序排序,原位操作,无返回值函数原型:
1 | void std::sort<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator) |
举例:
1 | #include <iostream> |
2、消除相邻的重复元素 unique()
使用到的函数为 unique() :将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器,一般配合 sort() 使用,函数原型:
1 | std::vector<int>::iterator |
举例:
1 | #include <iostream> |
3、逆序 reverse()
方法1:使用到的函数为 reverse() :将输入序列按照下标逆序排列,原位操作,无返回值函数原型:
1 | void std::reverse<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator) |
方法2:使用 greater<int>()
作为参数(内置函数)
1 | sort(nums.begin(), nums.end(), greater<int>()); |
举例:
1 | #include <iostream> |
容器的重排同样需要用到头文件 <algorithm>
中的算法。
1、最大值 auto it = max_element(v.begin, v,end()),返回最大值的迭代器,函数原型如下:
1 | constexpr std::vector<int>::iterator std::max_element<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator) |
2、最小值 auto it = min_element(v.begin, v,end()),返回最小值的迭代器,函数原型如下:
1 | constexpr std::vector<int>::iterator std::min_element<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator) |
3、相对位置大小 auto b = distance(x, y),x、y 是迭代器类型,返回 x、y 之间的距离,可以用来获取最大/小值的索引,函数原型如下:
1 | std::ptrdiff_t std::distance<std::vector<int>::iterator>(std::vector<int>::iterator __first, std::vector<int>::iterator __last) |
举例:
1 | #include <iostream> |
与内置数组一样,vector 的所有元素必须存放在一片连续的内存中,但 vector 的大小可变性使得其所占用的内存大小也是可变的。
为了避免每次改变 vector 时重新分配内存空间再将原来的数据从新拷贝到新空间的操作,标准库实现者采用了减少容器空间重新分配次数的策略:当不得不获取新空间时,vector(string 也是如此)通常会分配比需求更大的空间作为预留的备用空间,这样就减少了重新分配空间的次数。
举例:
1 | #include <iostream> |
一般来说,我们在使用 C++ 编程时会将 vector 类型的数据与类似于使用 a[N] 定义的内置数组统称为数组,两者是很类似的数据结构,在一般的任务中使用 vector数组 与使用内置数组通常没有什么区别。两者的区别主要如下:
如果不确定元素的确定个数,那么 vector 就是最好的选择。
# C++
[[___未完成]]
在C++里很多时候我们会遇到函数想返回两个以上结果的情况,这时候可以用数组(vector)、类来作为容器返回,也可以声明一个全局变量的数组,将数值存放在数组里解决。
第一个方式是使用引用来解决,将vector的引用在函数间传递 这是一个例子,假设我要传入一个数,我的函数的功能是返回这个数后面十个数的序列。
#include
/ 输入一个数,返回这个数后面的十个数字序列 注意参数的这个 &
符号不能省略 / void getSequence(int num,vector
int main(){ int num=9; vector
第二个方式是返回vector变量 在被调用函数中声明一个vector变量,函数结束的时候返回vector变量 但是这样的传参方式我有一个不太理解的地方,既然vector变量是在被调函数中声明的,就应该是一个局部变量,在被调函数执行完毕之后这部分空间应该会被销毁,这个变量就无法访问到了,莫非vector是在堆空间开辟的地址?然后返回的其实是指向堆空间vector的指针?
vector
int main(){ int num=9; vector
将字符串转换为浮点数的最简单方法是使用以下C ++ 11函数:
这些函数在string头文件中定义。
示例
1 |
|
num_float = 123.457 num_double = 123.457
我们可以使用std::atof()函数将char数组转换为double。
示例
1 | #include <iostream> |
num_double = 123.457