j'utilise bsxfun
à vectoriser une opération d'extension singleton entre les matrices de dimensions:Utilisation d'bsxfun avec l'expansion singleton avec des matrices de trois dimensions
MS: (nms, nls)
KS: (nks, nls)
L'opération est la somme des différences absolues entre chaque valeur MS(m,l)
avec m
en 1:nms
et l
en 1:nls
, et tous KS(k,l)
avec k
en 1:nks
.
Je y arrive en code:
[~, nls] = size(MS);
MS = reshape(MS',1,nls,[]);
R = sum(abs(bsxfun(@minus,MS,KS)));
R
est de taille (nls, nms)
.
Je veux généraliser cette opération à une liste d'échantillons, de sorte que les nouveaux formats seront:
MS: (nxs, nls, nms)
KS: (nxs, nls, nks)
Ceci peut être réalisé facilement avec une boucle qui exécute le premier morceau de code pour chaque 2 dimensions matrices, mais je soupçonne que la performance peut être beaucoup mieux en généralisant le code précédent en ajoutant une nouvelle dimension.
R
a serait de taille: (nxs, nls, nms)
J'ai essayé de remodeler MS
à 4 dimensions sans succès. Cela pourrait-il être fait avec remodelage et bsxfun
?
Cela peut être fait, mais votre description des dimensions est un peu floue pour moi. Pouvez-vous donner un petit exemple? Ou expliquer comment les nouvelles tailles sont liées aux anciennes tailles? –
J'ai ajouté une réponse basée sur 'bsxfun' et' permute'. Si vos dimensions sont énormes et que les performances sont importantes, il peut être plus rapide de «permuter» l'index de sommation pour qu'il soit en premier lieu, de sorte que la fonction sum_mation agit sur des blocs de mémoire contigus. –
Voulez-vous dire permuter sur MS? – jruizaranguren