2013-08-22 7 views
0

J'essaie d'intégrer toutes les matrices 2x2 A (i-1: 1, j-1: j) dans Matlab sans utiliser de boucle. En ce moment je le fais en boucle mais c'est extrêmement lent. Le code est montré ci-dessous:Intégration de matrices sans boucle dans Matlab

A=rand(100) 
t=linespace(0,1,100); 
for i=2:length(A) 
    for j=2:length(A) 
     A_minor=A(i-1:i,j-1:j); 
     B(i,j)=trapz(t(j-1:j),trapz(t(i-1:i),A_minor)); 
    end 
end 

Je voudrais faire ceci sans employer des boucles pour accélérer le calcul.

Répondre

1

Si vous avez la Boîte à outils de traitement d'image Matlab, vous pouvez utiliser blockproc pour faire ce que vous voulez.

http://www.mathworks.com/help/images/ref/blockproc.html

Pour utiliser blockproc, vous devez définir une fonction qui fait ce que vous voulez exécuter sur chaque position dans la matrice. Notez que la façon dont vous utilisez trapz rend les choses un peu plus compliquées (en passant les valeurs x - si vous pouvez vous en passer, vous pouvez simplifier le code) - ici, je lance trapz sans elles et redimensionne les résultats.

% Data 
foo = rand(100); 
t = linspace(0,1,100); 

% Execute blockproc on the indexes 
fooproc = blockproc(foo, [2, 2], @(x) trapz(trapz(x.data))); 
fooproc = fooproc * (t(2)-t(1))^2; % re-scale by the square of the step size 

Si vous devez transmettre les valeurs de x à trapz, la solution devient un peu plus délicat.

+0

Pourriez-vous nous donner d'autres explications? –

+0

Vous pouvez utiliser cette fonction pour exécuter une fonction sur chaque bloc d'une matrice. Vous pouvez spécifier si vous souhaitez que les blocs se chevauchent ou soient disjoints. Donc, dans votre cas, vous voulez exécuter une fonction sur chaque bloc 2x2 de la matrice. Je vais modifier ma réponse pour fournir plus de détails. –

+0

Pourriez-vous éditer le code pour incorporer des blocs qui se chevauchent? Je ne peux pas comprendre. Merci! –

0

Comme trapz est une fonction simple (en particulier sur une matrice 2x2), vous pouvez simplement calculer le résultat directement, sans faire appel à une fonction:

t = linspace(0,1,100); % Note that this is a step size of 0.010101 
A = rand(100); 
B = nan(size(A)); 

Atmp = (A(1:end-1,:) + A(2:end,:))/2; 
Atmp = (Atmp(:,1:end-1) + Atmp(:,2:end))/2; 

B(2:end,2:end) = Atmp * (t(2)-t(1))^2; 

Cela devrait vous donner exactement le même résultat que votre pour boucle, mais beaucoup plus rapide.