0

私は(かなり複雑です-とにかく私にとっては)cellfun操作を行っており、意図したことを実際に行っているかどうかを判断するために、賢明な頭が必要です。

b = cellfun(@(x) nansum(bsxfun(@times, mag(:),cross(u{1},x))),r,'UniformOutput',false);

 size(mag)

ans =

    81     3

 size(u{1})

ans =

    81     3

size(r)

ans =

     1    81

u と r は cell 配列です。私が必要とするアルゴリズム:

-> u{1} の各要素を取り、それらを r{1} の各要素とクロス積します。-> 結果の 81 x 3 セルに mag (サイズ 81 x 3) を掛けます。-> u{1} の各要素を取り、それらを r{2} の各要素とクロス積します。-> 結果の 81 x 3 セルに mag (サイズ 81 x 3) を掛けます。

等々.....

次のエラーが表示されます。

??? Error using ==> bsxfun
Non-singleton dimensions of the two input arrays must match each other.

Error in ==> cellcross>@(x)nansum(bsxfun(@times,mag(:),cross(u{1},x))) at 2
    b = cellfun(@(x) nansum(bsxfun(@times, mag(:),cross(u{1},x))),r,'UniformOutput',false);

Error in ==> cellcross at 2
    b = cellfun(@(x) nansum(bsxfun(@times, mag(:),cross(u{1},x))),r,'UniformOutput',false);

私の論理はどこで私を失敗させますか? mag を u のようなセル配列に変更し、cellfun を使用して乗算を行う方が簡単でしょうか?

magを削除することも指摘します:

b = cellfun(@(x) nansum(cross(u{1},x)),r,'UniformOutput',false);

期待どおりに動作するので、結果に u を掛ける問題です。

ガンターズコメントの編集:

u と r の 2 つのオブジェクトがあるとしましょう - どちらもセルです

u =

1 1 0              1st element
2 2 0              2nd element
3 3 0              3rd element

r =

3 3 0
2 2 0
1 1 0

私がやりたいことは次のとおりです。

cross(u{1},r{1})

= cross([1 1 0],[3,3,0]) + cross([2 2 0],[2,2,0]) + cross([3 3 0],[1,1,0] )

次に繰り返します:

 sum(cross(u{1},r{2}))
 sum(cross(u{1},r{3}))
 . 
 .
 . 
 .
4

1 に答える 1

0

全体をチェックして結果が正しいことを確認するのは少し難しいですが、最初の概算では、外積を243x1にすることで平坦化magしているため、外積が失敗しているように見えます。mag(:)、 そのようです

>> size(mag(:))
ans =
243     1
>> size(mag)
ans =
81     3

エラーが示すように、それが原因で@times製品が失敗しています。したがって、変更された呼び出しは

cellfun(@(x) nansum(bsxfun(@times, mag,cross(u{1},x))),r,'UniformOutput',false)
于 2012-09-06T15:14:26.350 に答える