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 矩阵。

我应该如何阅读结构?

  1. Graphem: : ..显示行,
  2. Graphem: end:-1 .. ??
  3. 字母表: :1 ..

不知何故,“:”对我来说是显示所有元素的运算符。

Operand1 , Operand2”显示 2 维矩阵对我来说很有意义。

我的背景:
我是语言专业本科生
根据 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:31:1:3 的简化形式:rangeStrart:increment:rangeEnd。现在,3:13: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]