如何在 MATLAB 中的元胞数组中进行点积?

How to do dot product in a cell array in MATLAB?

我有一个包含 5 个矩阵的元胞数组 (C)。每个矩阵代表不同的一组向量(即每个矩阵有两列。一列是 x 坐标;另一列是 y 坐标。行号的变化取决于向量的数量)

C{1} = [20x2 double];
C{2} = [23x2 double]; 
C{3} = [32x2 double] ...

本例中C{1}中有20个向量; C{2} 中的 23 个向量等等。有没有什么办法(除了一个或两个 for 循环)来为每个矩阵的两个相邻向量做点积?

C{1} = [2,3; 1,2; 5,4; 8,3; ...]  

计算 [2,3]&[1,2] 的点积,然后 [1,2]&[5,4] 然后 [5,4]&[8,3] 等等。

所以最后,我希望得到一个包含 5 个单元格的单元格数组。每个单元格都是一个 [n-1,1] 数组(n 是矩阵的长度)。

dots = [5x1 cell]. 
dots{1} = [19x1 double]; 
dots{2} = [22x1 double];
dots{3} = [31x1 double] ...

您可以使用cellfun计算每个坐标(行)和下一个坐标(行)之间的点积。

dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0)

说明

我们使用 x(1:end-1,:) 获取第一行进行比较,然后要与 下一个 x(2:end,:) 执行点积。在执行点积时,我们要指定我们想要沿第二个维度的点积,因此我们为 dot.

的第三个输入提供 2
dp = dot(C{1}(1:end-1,:), C{1}(2:end,:), 2);

我们使用 cellfun 对每个元胞数组元素执行此操作。

例子

C = {rand(10,2), rand(20,2), rand(30,2), rand(40, 2), rand(50,2)};
dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0)

    [9x1 double]   [19x1 double]   [29x1 double]   [39x1 double]   [49x1 double]