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]。
两个问题:
虽然我对如何使这段代码运行得更快的任何建议持开放态度,但我也想知道这里发生了什么。提前谢谢。
答案 0 :(得分:1)
您可以参考max
的{{3}}。
Matlab函数能够检测输入/输出参数的数量。在这种情况下,max
意识到用户设计了2个输出参数。然后它将按照文档中“语法”(并在下面描述)的第3行中的定义工作。
输入中第一个最大元素的INDEX存储在第二个输出变量中,而不是最大值。在关于j
的每次迭代中,max
将A(j,:)
作为行输入,作为其输入。由于最后一个元素总是最大的,3
将始终是它的第二个输出。它存储在m(j)
中。
~
意味着忽略这个论点。它被视为一个参数(所以max
有2个输出参数),但Matlab不会将其输出存储到任何变量。
BTW j
和i
不是好的迭代器,因为在Matlab中它们被内部指定为虚构的统一。请改用ii
,jj
或m
,n
。
答案 1 :(得分:1)
除了what Yvon has explained之外,代码可以简化为
A = [1:3;4:6;7:9;10:12];
[~, m] = max(A.');
这是因为应用于矩阵的max
会在每列中运行。 .'
中的A
为matrix transpose,因此现在max
将按A
行进行。
使用这种方法,您可以立即使用整个矩阵,而不是遍历其行。这称为vectorizing。在Matlab中,向量化操作通常比for
循环更快,并且导致更紧凑的代码。