今天看代码时,遇到了一个令我有点惊讶的一个赋值问题。
虽然是一个很小很小的问题,很多人可能都不会纠结一看就懂,但对于我来说还是攻克了一个难关涨了点姿势呀
下面附上我追根究底的简单代码:
clc;
a=[1 2 3 4 5,6,7,8 9 10 11 12];
%a(1,10:13)=2:5; %没错 难道可以这样赋值??惊讶 此时a_len = 13
%a(10:13)=2:5; %也不错 与a(1,10:13)=2:5; 等价
%a(10:13) %若不赋值,只是通过下标访问数组 则会出现错误:索引超出矩阵维度。
%%%%上边所示都是一维数组
b=[1
在MATLAB编程中,矩阵赋值是一个常见的操作,但如果不注意矩阵的维度和索引,可能会遇到一些陷阱。本文将详细解析在MATLAB中对矩阵进行赋值时应注意的维度问题。
我们要理解MATLAB中的数组和矩阵的概念。数组是多维的数据结构,而矩阵则是特殊的二维数组。在MATLAB中,矩阵的赋值可以是单个元素,也可以是连续的一段元素或者整个矩阵。
1. **扩展赋值**:
在示例代码中,`a=[1 2 3 4 5,6,7,8 9 10 11 12];` 是一个一维数组,尝试对超出当前范围的元素进行赋值,如 `a(1,10:13)=2:5;` 和 `a(10:13)=2:5;`,MATLAB允许这样做,并且会自动扩展数组以适应赋值。这意味着即使索引超出原始数组的大小,MATLAB也会创建新的元素来存储赋值的数据。因此,原本长度为13的一维数组`a`,可以被扩展并赋值。
2. **匹配赋值**:
当赋值操作涉及两个矩阵时,例如 `a(3:5)=b(1,:)`,要求赋值的左右两边元素数目相同。如果两边元素数目不匹配,如 `a(3:6)=b(1,:)`,MATLAB会抛出错误,因为赋值的目标区域比源区域大。同时,如果目标区域的索引超出其原有的维度,如 `a(3:5)=b(1,2:4);`,也会导致“索引超出矩阵维度”的错误。
3. **模糊维操作**:
对于二维数组`b`,当试图在模糊的维度上扩展数组,如 `b(8:10)=1:3;`,MATLAB会报错,因为这会导致矩阵的尺寸不确定。MATLAB要求在赋值时清晰地指定维数,避免产生不明确的扩展。
4. **单列赋值**:
在二维数组中,单列赋值如 `b(1,3:4)=10:11;` 是允许的,这会在第二列添加新元素,用0填充未指定的元素。而 `b(1,1:4)=11:12;` 会因赋值维度不匹配而报错,因为左侧有4个元素,右侧只有2个。
5. **只读访问**:
如果只是访问数组或矩阵的元素,而不进行赋值,如 `a(10:13)` 或 `b(1,1:4)`,当索引超出矩阵实际维度时,MATLAB会抛出“索引超出矩阵维度”的错误,因为这涉及到对不存在的数据进行操作。
总结起来,MATLAB的矩阵赋值规则如下:
- 赋值时,如果右侧是常数或等长的向量,MATLAB会自动扩展矩阵以适应赋值,即使索引超出了原数组的维度。
- 如果右侧是矩阵,赋值操作要求左右两侧的元素数目相同,且不能超出矩阵的原有维度。
- 对于二维数组,不能在模糊的维度上进行扩展赋值。
- 只读访问时,必须确保索引在矩阵的维度范围内,否则会引发错误。
理解这些规则对于编写有效的MATLAB代码至关重要,能够帮助我们避免不必要的错误并更高效地利用MATLAB的强大功能。在编程实践中,一定要注意矩阵的维度和索引,以确保代码的正确性和效率。
|