3

次の 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 = (cross(orient{1,1},distance{1,1}) + cross(orient{1,1},distance{1,2}) +...) sum2 = (cross(orient{1, 2},距離{1,1}) + クロス(向き{1,2},距離{1,2}) +...)

ここで、各「合計」は、距離のすべての要素と交差する単一の方向要素の単なる反復であり、それらの外積が合計されます。次に、次のようになります。

mastersum = sum1 sum2 sum3
            sum4 sum5 sum6
            sum6 sum8 sum9

どこ

sum1 = 

[1x3 double]

私はこれを紛らわしい方法で入れているだけですか?

4

1 に答える 1

4

cellfunを使用して、ループなしでセル配列をトラバースする必要がありますfor

2 つのベクトル フィールド (2 つの cell 配列) の場合、次のようにする必要があります。

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}

于 2012-07-18T08:59:29.507 に答える