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 是元胞数组。我需要的算法:

-> 取 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 是一个问题。

编辑 gunthers 评论:

假设我有两个对象 u 和 r - 都是单元格

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})

= 交叉([1 1 0],[3,3,0]) + 交叉([2 2 0],[2,2,0]) + 交叉([3 3 0],[1,1,0] )

然后重复:

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

1 回答 1

0

对我来说,检查整个事情并确保结果正确有点困难,但对于第一个近似值来说,唯一的问题是你的交叉产品失败了,因为你mag通过使用mag(:)使它变平来使其成为 243x1 , 像这样

>> 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 回答