Split/slice 向量转换为子向量并在没有循环的情况下获得它们的范数

Split/slice vectors into sub-vectors and get their norms without a loop

我在 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 逻辑来删除循环?

您可以使用reshape制作切片的二维矩阵

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

然后计算(欧几里德)范数及其距离之和

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

您可以在任一方向求和,具体取决于您重塑矢量的方式。根据您想要 256 片还是 5 片,您可能需要更改 sumDIM 参数以从对行求和切换到对列求和。

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 函数的两个维度。只要你选择一个值,它是向量中元素数量的一个因素,你就可以做到

sliceA = reshape(vectorA, 128, []); % correct number of slices of 128
sliceA = reshape(vectorA, [], N);   % This would use N how you are in the loop