【问题标题】:How to do dot product in a cell array in MATLAB?如何在MATLAB中的单元格数组中做点积?
【发布时间】:2016-07-17 04:39:58
【问题描述】:

我有一个包含 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] ...

【问题讨论】:

    标签: matlab matrix cell dot-product


    【解决方案1】:

    您可以使用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]
    

    【讨论】:

    • 谢谢。但这将为每个矩阵提供一个点积,并产生一个 nx1 向量(n 是元胞数组的长度)。就我而言,我想一次对 4 个元素进行点积。因此,如果 C{1} = [20x2 double],我希望得到一个 [19x1 double] 数组。
    • @JameeLin 好的答案已更新以解决此问题。希望它现在可以按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多