Matlab矢量替换解释

时间:2014-07-26 17:10:18

标签: matlab

Matlab新手,在我讨论这个问题时阅读别人的代码:

A = [1:3;4:6;7:9;10:12];
A
m = zeros(4,1);
m
for j = 1:4
    [~,m(j)] = max(A(j,:));
end
m

我认为作者的意图是在向量m中存储A的每一行的最大值。但是,代码返回m = [3,3,3,3]。

两个问题:

  1. 为什么在括号内会出现矢量替换?
  2. 〜扮演什么角色?
  3. 虽然我对如何使这段代码运行得更快的任何建议持开放态度,但我也想知道这里发生了什么。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以参考max的{​​{3}}。

Matlab函数能够检测输入/输出参数的数量。在这种情况下,max意识到用户设计了2个输出参数。然后它将按照文档中“语法”(并在下面描述)的第3行中的定义工作。

输入中第一个最大元素的INDEX存储在第二个输出变量中,而不是最大值。在关于j的每次迭代中,maxA(j,:)作为行输入,作为其输入。由于最后一个元素总是最大的,3将始终是它的第二个输出。它存储在m(j)中。

Matlab中的

~意味着忽略这个论点。它被视为一个参数(所以max有2个输出参数),但Matlab不会将其输出存储到任何变量。

BTW ji不是好的迭代器,因为在Matlab中它们被内部指定为虚构的统一。请改用iijjmn

答案 1 :(得分:1)

除了what Yvon has explained之外,代码可以简化为

A = [1:3;4:6;7:9;10:12];
[~, m] = max(A.');

这是因为应用于矩阵的max会在每列中运行。 .'中的Amatrix transpose,因此现在max将按A行进行。

使用这种方法,您可以立即使用整个矩阵,而不是遍历其行。这称为vectorizing。在Matlab中,向量化操作通常比for循环更快,并且导致更紧凑的代码。