2012-07-18 68 views
2

我有以下两种向量字段:交叉产品之间的两个单元阵列

>> 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 =(交叉(东方{1,1},{距离1,1})+交叉(东方{1 ,距离{1,2})+ ...) sum2 =(cross(orient {1,2},distance {1,1})+ cross(orient {1,2},distance {1, 2})+ ...)

其中每个'sum'只是一个单一东方元素的迭代,与所有距离元素交叉,然后这些交叉积被求和。然后我会:

mastersum = sum1 sum2 sum3 
      sum4 sum5 sum6 
      sum6 sum8 sum9 

其中

sum1 = 

[1x3 double] 

我只是把这个在一个混乱的方式吗?

回答

4

您将需要使用cellfun遍历单元格阵列,而不需要使用for -loop。

两年矢量场(两个单元阵列),你应该做的:

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},等等...

+0

确定我看到。那很棒。这导致我另一个问题(请参阅上面的编辑^^^^) – brucezepplin 2012-07-18 09:12:47

+0

@brucezepplin好的。顺便说一下,我有一个错误,请看更新的答案 – 2012-07-18 09:19:10

+0

嗨Eitan - 是的,我已经尝试了两个,第二个工作,我现在意识到,我实际需要(和类似的逻辑)是采取一个单一的元素然后将其与所有距离元素的叉积,然后求和成一个单独的向量。然后继续前进到东方的下一个元素,并做相同的... – brucezepplin 2012-07-18 09:23:32