Matlab矩阵地址

3

在我的课程中,我遇到了这个表达式:

A(:,end:-1:1)

我很难理解和阅读第二个运算符 "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]。运算符是,,然后是,
A(:,1).. 以行的形式输出[1 2 3; 4 5 6; 7 8 9]。运算符是,先于:

A(:,end:-1:1)

在Matlab中输出显示:3x3矩阵。

我该如何读取这个结构?

  1. Graphem: : ..展示给我行,
  2. Graphem: end:-1 .. ??
  3. Graphem: :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电路板。
因此,我熟悉程序存储器或指令存储器。
我只理解结果,但不知道它是如何由MATLAB编译器实现的。
有人告诉我,“矩阵寻址方式被优化了”。期待每一步都有帮助的答案。 :)

先行谢过!


4
请参阅文档:https://www.mathworks.com/help/matlab/ref/colon.html - Cris Luengo
1
你在“我知道”的三个例子都是错误的。 - Cris Luengo
3个回答

3
矩阵索引中的关键字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的第三行。 编辑:@CrisLuengo解决了您的误解。

我知道:
A(:) 以行的形式输出[1 2 3; 4 5 6; 7 8 9],操作符为::
A(1,:) 以列的形式输出[1 2 3; 4 5 6; 7 8 9],操作符为:,,然后是:
A(:,1) 以行的形式输出[1 2 3; 4 5 6; 7 8 9],操作符为:,:

  • A(3, 2) 是矩阵 A 中第三行第二列的元素。
  • 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 所有元素构成的单列向量。

2
在MATLAB中,当访问数组时,它以 A(row#,col#) 形式访问。 row#col# 可以是整数或整数向量。如果它们是整数,则访问矩阵中的一个位置。如果它们是向量,则MATLAB将循环遍历该向量并选择与向量中的整数对应的 A 中的位置。 end:-1:1 创建一个包含整数的向量,这些整数范围从列数(在此情况下,因为您将此向量放在列部分: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]

1

我认为你稍微想多了。 如果我们有一个向量

A = [1 2 3]

当我们调用A(end:-1:1)时,我们得到一个向量[3 2 1]。索引返回了相同的向量,但值被颠倒了。如果现在我们有一个矩阵,
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),我们将返回v,但元素顺序相反。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接