2012-08-06 87 views
0

您好我有以下几点:循环通过cellfun计算

for j = 1:N 
    for i = 1:N 
     vecdir(i,:) = pos(i,:) - pos(j,:); 
     dist(i,:) = pdist2(pos(i,:),pos(j,:)); 
     norm(i,:) = vecdir(i,:)./(dist(i,:)).^2; 
    end 
    r{j} = norm; 

end 

u = {or}; 

在那里我有两个对象U和R:

>> u 

u = 

    [9x3 double] 

>> r 

r = 

    Columns 1 through 8 

    [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] 

    Column 9 

    [9x3 double] 

,我想借此为r的每一个单元,并采取将该单元格中每个元素的乘积与单元格u中的每个元素交叉并将结果求和成一个向量大小[1 3]。到目前为止,我可以用做一次(的R)这一个单元:

b_func = @(u)nansum(cell2mat(cellfun(@(v)cross(u,v)', {r{1}}, 'Un', 0))', 1); 
b = cellfun(b_func, u, 'UniformOutput', 0) 

其中

b = [1x3 double] 

但是我想要做的是在R代表做这一切细胞,使我最终的对象:

b = 

    Columns 1 through 8 

    [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] 

    Column 9 

    [1x3 double] 

,其中每个小区是上述的计算,但通过为r的每一个小区重复。任何想法如何做到这一点?

回答

1

如何:

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

测试:

>> u = {randi(5,[9 3])} 
u = 
    [9x3 double] 
>> r = arrayfun(@(x) randi(5,[9 3]),1:8,'UniformOutput',false) 
r = 
    Columns 1 through 6 
    [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] [9x3 double] 
    Columns 7 through 8 
    [9x3 double] [9x3 double] 
>> b = cellfun(@(x) nansum(cross(u{1},x)),r,'UniformOutput',false) 
b = 
    Columns 1 through 6 
    [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] 
    Columns 7 through 8 
    [1x3 double] [1x3 double] 
+0

这是优秀的,非常优雅。非常感谢! – brucezepplin 2012-08-07 09:26:58

0

你可以重塑它,使得细胞沿着第三维度去,将其转换为一个数组,总和:

b = nansum(cell2mat(reshape(cellfun(@(v)cross(u,v), r, 'Un', 0),1,1,[])),1); 

然后回到细胞并修复尺寸:

bfinal = shiftdim(mat2cell(b,[1],[3],ones(1,size(b,3))),1); 

结果:

>> bfinal 

bfinal = 

    Columns 1 through 6 

    [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] 

    Columns 7 through 9 

    [1x3 double] [1x3 double] [1x3 double] 
+0

@Phillip的F - 感谢您的回复菲利普,我开始使用你的答案时出现以下错误???使用==>错误时出错31 A和B必须具有相同的大小。 错误在==> @(v)交叉(u,v) 我怀疑这是与你如何声明r一样的r与r不一样大。 – brucezepplin 2012-08-06 15:29:43