我不太了解matlab的矢量化思维方式,主要是由于文档中提供的简单示例,我希望有人可以帮助我更好地理解它。
所以,我想要完成的是从ncols x nrows x ielements矩阵中取一个NxN样本,并计算每个ielement的平均值并存储平均值的最大值。使用for循环,代码如下所示:
for x = 1+margin : nrows-margin
for y = 1+margin : ncols-margin
for i=1:ielem
% take a NxN sample
sample = input_matrix(y-margin:y+margin,x-margin:x+margin,i)
% compute the average of all elements
result(i) = mean2(sample);
end %for i
% store the max of the computed averages
output_matrix(y,x)=max(result);
end %for y
end %for x
任何人都可以对这种情况的例子进行良好的矢量化吗? Ť
答案 0 :(得分:2)
首先,由于在运行代码之前编译代码的增强功能,矢量化并不像以前那么重要,但它仍然是一种非常常见的做法,可以带来一些增强功能。较旧的Matlab版本一次执行一行,这将使for循环比相同代码的矢量化版本慢得多。
矩阵中可以被矢量化的部分是内部更多的循环。我将展示一个关于您要做什么的简单示例,我将让您举例并将其放入您的代码中。
input=randn(5,5,3);
max(mean(mean(input,1),2))
基本上,内部两个mean
取输入数组的平均值,外部max
将找到该范围内的最大值。如果你愿意,你可以一步一步地解决它,看看它做了什么。 mean(input,1)
将取第一个维度的均值,mean(input,2)
乘以第二个维度等。在前两个均值完成后,剩下的就是一个向量,max函数将很容易运行。应该注意的是,矢量pre-max的大小是[1 1 3],在执行此操作时会保留尺寸。