2016-11-06 3 views

Répondre

0

Une solution aki:

function res = bsxfun_struct(f, A, B) 
    % best way to ensure our output size matches the behaviour of bsxfun is just to call it 
    dummy = bsxfun(@(ai, bj) ai+bj, zeros(size(A)), zeros(size(B))); 
    res_size = size(dummy); 

    % repeat the matrices as needed 
    Arep = repmat(A, res_size ./ size(A)); 
    Brep = repmat(B, res_size ./ size(B)); 

    % now we can just apply the function pairwise 
    res = arrayfun(f, Arep, Brep); 
end 
1

Cela peut ne pas être une solution générale * mais pour votre exemple particulier, il est facile de convertir votre tableau de la structure à un tableau numérique intérieur bsxfun, en utilisant comma-separated-list generator syntax , puis en utilisant votre fonction anonyme d'origine, à savoir

>> bsxfun(@(ai, bj) ai+bj, [a.x], [b.x]') 
ans = 
    4  5 
    5  6 

et cela devrait encore tirer parti de l'efficacité de calcul conférée par 0.123.(par opposition à l'approche beaucoup plus lente "repmat + arrayfun", par exemple).


* par exemple. il peut ne pas fonctionner comme prévu si votre champ contient un tableau au lieu d'un scalaire, puisque l'expansion vers une liste séparée par des virgules sera différente

+0

Malheureusement, la raison pour laquelle je devais après cela était d'utiliser deux champs de la structure – Eric

+0

Eh bien, selon la nature exacte de votre problème, vous pouvez toujours utiliser cette technique si vos champs ont le bon format. Qu'essayez-vous de faire? –