Matlab矩阵地址
Matlab Matrixaddress
在我的课程中,我遇到了这个表达:
A(:,end:-1:1)
I have trouble to understand and read the morphemic structure of the 2nd Operand "end;-1;1"
举个例子:
A=[1 2 3; 4 5 6; 7 8 9]
我知道:
A(:)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为行。运算符是 :
.
A(1,:)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为列 Operator is ,
then ,
.
A(:,1)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为行。运算符是 ,
预先 :
.
A(:,end:-1:1)
Matlab 中的输出显示:3x3
矩阵。
我应该如何阅读结构?
- Graphem: : ..显示行,
- Graphem:
end:-1
.. ??
- 字母表: :
1
..
不知何故,“:
”对我来说是显示所有元素的运算符。
“Operand1 , Operand2
”显示 2
维矩阵对我来说很有意义。
第一个想法:
end:-1:1
表达式在我看来就像一个循环。所以 -1, 0, 1 => **3x Elements**
?
但是当我输入
A(1,end:3)
它只显示第三行。
第二个想法:
A(end:-1:1,1)
它向我展示了倒矩阵..
我的背景:
我是语言专业本科生
根据 Ben Eater 的说法,我在空闲时间构建了 8 位 Sap1。
所以我对程序内存或者指令内存比较熟悉
我understand只是结果,而不是MATLAB编译器是如何实现的。
有人对我说“矩阵寻址以某种方式进行了优化”。
期待在每一步中得到有用的答案。 :)
提前致谢!
矩阵索引中的end
关键字表示对应维度中最后一个元素的索引。因此,A(:,end:-1:1)
只是表示 A(:, size(A, 2):-1:1)
,在您的示例 (A=[1 2 3; 4 5 6; 7 8 9]
) 中,它等同于 A(:, 3:-1:1)
.
但是要了解它的作用,您需要了解 3:-1:1
的作用。它创建了一个子范围。您已经知道 1:3
创建 [1, 2, 3]
。 1:3
是 1:1:3
的简化形式:rangeStrart:increment:rangeEnd
。现在,3:1
或 3:1:1
创建一个空向量,因为 rangeStart
大于 rangeEnd
。要创建 [3, 2, 1]
,您需要使用负步骤:3:-1:1
.
因此,A(:,end:-1:1)
表示 A(:, [3, 2, 1])
,它颠倒了 A
的行顺序。此外,A(:,end:3)
表示 A(:, 3:3)
,最终表示 A(:, 3)
,即 returns A
的第 3 行。
编辑:关于你的误解,@CrisLuengo
I am aware of:
A(:).. Outputs [1 2 3; 4 5 6; 7 8 9] as rows. Operator is :.
A(1,:).. Outputs [1 2 3; 4 5 6; 7 8 9] as columns Operator is , then , .
A(:,1).. Outputs [1 2 3; 4 5 6; 7 8 9] as rows. Operator is ,beforehand : .
A(3, 2)
是A 的3,2位置(第三行第二列)的元素
A(1, :)
等同于 A(1, 1:size(A, 2))
和 A(1, 1:end)
并且是 A
的第一行
A(:, 1)
等同于 A(1:size(A, 1), 1)
和 A(1:end, 1)
并且是 A
的第一列
A(:)
等同于 A(1:numel(A))
并且是包含 A
的所有元素的单个列
我觉得你有点想多了。
如果我们有一个向量
A = [1 2 3]
然后我们调用A(end:-1:1)
,然后我们得到一个向量[3 2 1]
。索引已 returned 相同的向量,但值相反。如果我们现在有一个矩阵
A = [1 2 3; 4 5 6; 7 8 9]
并调用A(:, end:-1:1)
,我们得到了每行具有相同值的矩阵,但是现在列被颠倒了
A(:, end:-1:1) = [3 2 1; 6 5 4; 9 8 7].
回想一下冒号在此上下文中的含义。
如果我们定义一个向量,v = (1:10)
,我们得到一个向量,第一个元素是 1
,最后一个元素是 10
,中间的每个值都是整数1
。如果我们改为定义 v = (1:2:10)
,我们得到相同的结果,但元素由 2
分隔,而不是 1
.
end:-1:1
是以同样的方式制作的矢量。第一个数字是A
行的最后一个元素,最后一个数字是该行的第一个元素。每个数字由值 -1
分隔。如果我们尝试
v = 10:-1:1
我们得到 [10 9 8 7 6 5 4 3 2 1]
。如果我们调用 v(2:4)
,我们将得到 v
的第二个、第三个和第四个元素。如果我们调用 v(1:end)
,我们只会得到 v
。如果我们调用 v(end:-1:1)
,我们 return v
,元素的顺序相反。
编辑 打字错误。
在 MATLAB 中,当访问一个数组时,它被访问为 A(row#,col#)
。 row#
和 col#
可以是整数或整数向量。如果它们是整数,则访问矩阵中的一个点。如果它们是向量,则 MATLAB 将遍历向量并选择 A
中与向量中的整数相对应的点。
end:-1:1
创建一个向量,其中包含从列数(在本例中是因为您将此向量放在 col 部分:A(row#,col#)
)到 1 之间的整数。例如:4x5
矩阵,end:-1:1
将是 [5 4 3 2 1]
.
当你把 : 放在矩阵的行部分时,这意味着你访问了矩阵的所有行。
下面是 A(:,end:-1:1)
的示例
col#
向量 (:) 是 [1 2 3]
而 row#
向量 (end:-1:1)
是 [3 2 1]
A = [1 2 3;
4 5 6;
7 8 9]
A(:,end:-1:1)
[3, 5, 7]
在我的课程中,我遇到了这个表达:
A(:,end:-1:1)
I have trouble to understand and read the morphemic structure of the 2nd Operand "end;-1;1"
举个例子:
A=[1 2 3; 4 5 6; 7 8 9]
我知道:
A(:)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为行。运算符是 :
.
A(1,:)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为列 Operator is ,
then ,
.
A(:,1)
.. 输出 [1 2 3; 4 5 6; 7 8 9]
作为行。运算符是 ,
预先 :
.
A(:,end:-1:1)
Matlab 中的输出显示:3x3
矩阵。
我应该如何阅读结构?
- Graphem: : ..显示行,
- Graphem:
end:-1
.. ?? - 字母表: :
1
..
不知何故,“:
”对我来说是显示所有元素的运算符。
“Operand1 , Operand2
”显示 2
维矩阵对我来说很有意义。
第一个想法:
end:-1:1
表达式在我看来就像一个循环。所以-1, 0, 1 => **3x Elements**
?
但是当我输入A(1,end:3)
它只显示第三行。第二个想法:
A(end:-1:1,1)
它向我展示了倒矩阵..
我的背景:
我是语言专业本科生
根据 Ben Eater 的说法,我在空闲时间构建了 8 位 Sap1。
所以我对程序内存或者指令内存比较熟悉
我understand只是结果,而不是MATLAB编译器是如何实现的。
有人对我说“矩阵寻址以某种方式进行了优化”。
期待在每一步中得到有用的答案。 :)
提前致谢!
矩阵索引中的end
关键字表示对应维度中最后一个元素的索引。因此,A(:,end:-1:1)
只是表示 A(:, size(A, 2):-1:1)
,在您的示例 (A=[1 2 3; 4 5 6; 7 8 9]
) 中,它等同于 A(:, 3:-1:1)
.
但是要了解它的作用,您需要了解 3:-1:1
的作用。它创建了一个子范围。您已经知道 1:3
创建 [1, 2, 3]
。 1:3
是 1:1:3
的简化形式:rangeStrart:increment:rangeEnd
。现在,3:1
或 3:1:1
创建一个空向量,因为 rangeStart
大于 rangeEnd
。要创建 [3, 2, 1]
,您需要使用负步骤:3:-1:1
.
因此,A(:,end:-1:1)
表示 A(:, [3, 2, 1])
,它颠倒了 A
的行顺序。此外,A(:,end:3)
表示 A(:, 3:3)
,最终表示 A(:, 3)
,即 returns A
的第 3 行。
编辑:关于你的误解,@CrisLuengo
I am aware of:
A(:).. Outputs [1 2 3; 4 5 6; 7 8 9] as rows. Operator is :.
A(1,:).. Outputs [1 2 3; 4 5 6; 7 8 9] as columns Operator is , then , .
A(:,1).. Outputs [1 2 3; 4 5 6; 7 8 9] as rows. Operator is ,beforehand : .
A(3, 2)
是A 的3,2位置(第三行第二列)的元素
A(1, :)
等同于A(1, 1:size(A, 2))
和A(1, 1:end)
并且是A
的第一行
A(:, 1)
等同于A(1:size(A, 1), 1)
和A(1:end, 1)
并且是A
的第一列
A(:)
等同于A(1:numel(A))
并且是包含A
的所有元素的单个列
我觉得你有点想多了。 如果我们有一个向量
A = [1 2 3]
然后我们调用A(end:-1:1)
,然后我们得到一个向量[3 2 1]
。索引已 returned 相同的向量,但值相反。如果我们现在有一个矩阵
A = [1 2 3; 4 5 6; 7 8 9]
并调用A(:, end:-1:1)
,我们得到了每行具有相同值的矩阵,但是现在列被颠倒了
A(:, end:-1:1) = [3 2 1; 6 5 4; 9 8 7].
回想一下冒号在此上下文中的含义。
如果我们定义一个向量,v = (1:10)
,我们得到一个向量,第一个元素是 1
,最后一个元素是 10
,中间的每个值都是整数1
。如果我们改为定义 v = (1:2:10)
,我们得到相同的结果,但元素由 2
分隔,而不是 1
.
end:-1:1
是以同样的方式制作的矢量。第一个数字是A
行的最后一个元素,最后一个数字是该行的第一个元素。每个数字由值 -1
分隔。如果我们尝试
v = 10:-1:1
我们得到 [10 9 8 7 6 5 4 3 2 1]
。如果我们调用 v(2:4)
,我们将得到 v
的第二个、第三个和第四个元素。如果我们调用 v(1:end)
,我们只会得到 v
。如果我们调用 v(end:-1:1)
,我们 return v
,元素的顺序相反。
编辑 打字错误。
在 MATLAB 中,当访问一个数组时,它被访问为 A(row#,col#)
。 row#
和 col#
可以是整数或整数向量。如果它们是整数,则访问矩阵中的一个点。如果它们是向量,则 MATLAB 将遍历向量并选择 A
中与向量中的整数相对应的点。
end:-1:1
创建一个向量,其中包含从列数(在本例中是因为您将此向量放在 col 部分:A(row#,col#)
)到 1 之间的整数。例如:4x5
矩阵,end:-1:1
将是 [5 4 3 2 1]
.
当你把 : 放在矩阵的行部分时,这意味着你访问了矩阵的所有行。
下面是 A(:,end:-1:1)
col#
向量 (:) 是 [1 2 3]
而 row#
向量 (end:-1:1)
是 [3 2 1]
A = [1 2 3;
4 5 6;
7 8 9]
A(:,end:-1:1)
[3, 5, 7]