【问题标题】:Cross product between two cell arrays两个单元阵列之间的叉积
【发布时间】:2012-07-18 08:50:48
【问题描述】:

我有以下两个向量场:

>> orient

orient = 

    [1x3 double]    [1x3 double]    [1x3 double]
    [1x3 double]    [1x3 double]    [1x3 double]
    [1x3 double]    [1x3 double]    [1x3 double]

>> distance

distance = 

    [1x3 double]    [1x3 double]    [1x3 double]
    [1x3 double]    [1x3 double]    [1x3 double]
    [1x3 double]    [1x3 double]    [1x3 double]

我需要取成对元素的叉积,即

b = (cross(orient{1,1},distance{1,1}) + cross(orient{1,2},distance{1,2})..... and so on

然后重塑以匹配距离和方向的尺寸。

我可以在不使用 for 循环的情况下执行此操作吗?

如果我有

orient{1,1} = 

[1x3 double]

distance = 

        [1x3 double]    [1x3 double]    [1x3 double]
        [1x3 double]    [1x3 double]    [1x3 double]
        [1x3 double]    [1x3 double]    [1x3 double]

我该怎么做

sum1 = (cross(orient{1,1},distance{1,1}) + cross(orient{1,1},distance{1,2}) +...) sum2 = (cross(orient{1,2},distance{1,1}) + cross(orient{1,2},distance{1,2}) +...)

其中每个“和”只是单个 orient 元素的迭代,与所有距离元素相交,然后将这些叉积​​相加。然后我会:

mastersum = sum1 sum2 sum3
            sum4 sum5 sum6
            sum6 sum8 sum9

在哪里

sum1 = 

[1x3 double]

我只是把它放在一个令人困惑的地方吗?

【问题讨论】:

    标签: matlab for-loop cross-product


    【解决方案1】:

    您需要使用cellfun 来遍历没有for-循环的元胞数组。

    对于两个向量场(两个元胞数组),你应该这样做:

    crosses = cellfun(@(u, v)cross(u, v)', orient, distance, 'UniformOutput', 0);
    b = sum(cell2mat({crosses{:}})', 1)  %# Summing all vectors in all cells
    

    来自orient 的单个单元格的类似过程,比如orient{1, 2},将是:

    u = orient{1, 2};
    crosses = cellfun(@(v)cross(u, v)', distance, 'UniformOutput', 0);
    b = sum(cell2mat({crosses{:}})', 1)  %# This command remains the same
    

    要从 orient 获取所有向量的结果而不使用 for 循环,请改为:

    b_func = @(u)sum(cell2mat(cellfun(@(v)cross(u,v)', {distance{:}}, 'Un', 0))', 1);
    U = cellfun(b_func, orient, 'UniformOutput', 0)
    

    现在U 也是一个元胞数组(与orient 具有相同的维度):U{1, 1} 具有orient{1, 1} 的交叉总和,U{1, 2} 具有orient{1, 2} 的交叉总和,等等...

    【讨论】:

    • 好的,我明白了。那太棒了。这导致我另一个问题(请参阅上面的编辑^^^^)
    • @brucezepplin 好的。顺便说一句,我有一个错误,请看更新的答案
    • hi Eitan - 是的,我已经尝试了这两种方法,第二次工作,我现在意识到我真正需要的(并且通过类似的逻辑)是取一个 orient 元素,然后取将其与距离的所有元素相乘,然后求和为一个向量。然后移动到 orient 的下一个元素并做同样的事情......
    • 让我尝试一下最新的答案并了解它!非常感谢。
    • 我已接受您所指问题的上述答案。我看过你对最近一个问题的回答。这很好用。剩下的唯一一件事是,我如何自动化这个过程,以便我得到 u11 = orient{1, 1}; u12 = 方向{1, 2}; .....等等,然后将所有结果存储在一个名为U的对象中?每个东方工作的单独计算,但我想迭代东方的所有元素。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多