将矢量分割/切片成子矢量并在没有循环的情况下获得它们的规范

时间:2017-08-31 07:19:58

标签: matlab loops vector vectorization norm

我在MATLAB中有两个向量,vectorAvectorB - 两个长度相等的1280个元素。我想将矢量分成长度为256的子矢量,给出5个子矢量。

获得切片后,请说sliceAsliceB,我需要在两个切片上执行norm

目前我有以下代码:

for i = 1:N
    sliceA = vectorA(i:round(i*1280/N);
    sliceB = vectorB(i:round(i*1280/N));
    distance = distance+norm(sliceA,sliceB);
end
distance = distance/N;

是否可以使用一些疯狂的MATLAB逻辑来移除循环?

1 个答案:

答案 0 :(得分:2)

您可以使用reshape制作切片的2D矩阵

sliceA = reshape(vectorA, 256, 5);
sliceB = reshape(vectorB, 256, 5);

然后计算(欧几里得)规范及其距离和

norms = sqrt(sum((sliceA - sliceB).^2, 1));
distance = sum(norms)/5;

您可以向任意一个方向求和,具体取决于您重塑矢量的方式。根据您是否需要256或5的切片,您可能希望更改DIM的{​​{1}}参数,以便从汇总行切换到列之间的求和。

sum

注意,您不必计算norms = sqrt(sum((sliceA - sliceB).^2, 1)); % Sums down rows, slices of 256 norms = sqrt(sum((sliceA - sliceB).^2, 2)); % Sums across cols, slices of 5 函数的两个维度。只要您选择一个值作为向量中元素数量的因子,就可以

reshape