我有一个(对我来说非常复杂)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×3单元与mag(大小81×3)相乘。->取u{1}的每个元素,并将它们与r{2}的每一个元素进行叉积。->将得到的81×3单元与mag(大小81×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,它们都是细胞
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}))
.
.
.
.
对我来说,检查整件事并确保结果正确有点困难,但从第一个近似值来看,唯一的问题是你的叉积失败了,因为你使用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)