我有以下两个向量字段:

>> 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 =(十字(东方{1,2},距离{1,1})+十字(东方{1,2},距离{1,2})+ ...)

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

mastersum = sum1 sum2 sum3
            sum4 sum5 sum6
            sum6 sum8 sum9


哪里

sum1 =

[1x3 double]


我只是以一种令人困惑的方式来表达?

最佳答案

您需要使用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}叉,等等。

关于matlab - 两个单元格阵列之间的叉积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11537599/

10-11 02:38