2012-07-18 42 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