2016-03-29 1 views
0

J'ai un tableau de cellules (C) contenant 5 matrices. Chaque matrice représente autre ensemble de vecteurs (par exemple chaque matrice comporte deux colonnes One est coordonnée x;.. L'autre est coordonnée y le numéro de ligne variable dépend du nombre de vecteurs)Comment faire un produit scalaire dans une matrice de cellules dans MATLAB?

C{1} = [20x2 double]; 
C{2} = [23x2 double]; 
C{3} = [32x2 double] ... 

Dans ce cas, il y a 20 vecteurs dans C {1}; 23 vecteurs dans C {2} et ainsi de suite. Y at-il un moyen (autre qu'une ou deux pour la boucle) de faire le produit scalaire pour les deux vecteurs adjacents pour chaque matrice?

C{1} = [2,3; 1,2; 5,4; 8,3; ...] 

calculer le produit scalaire de [2,3] & [1,2], puis [1,2] & [5,4], puis [5,4] & [8,3] et ainsi de suite . Donc, à la fin, je m'attendrais à obtenir un réseau de cellules avec 5 cellules. Chaque cellule est un tableau [n-1,1] (n est la longueur de la matrice).

dots = [5x1 cell]. 
dots{1} = [19x1 double]; 
dots{2} = [22x1 double]; 
dots{3} = [31x1 double] ... 

Répondre

0

Vous pouvez utiliser cellfun pour calculer le produit scalaire entre chaque coordonnée (ligne) et la prochaine coordonnées (ligne).

dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0) 

Explication

Nous saisir les premières lignes à comparer à l'aide x(1:end-1,:) et que vous souhaitez effectuer le produit scalaire avec le suivant ligne x(2:end,:). Lors de l'exécution du produit scalaire, nous voulons spécifier que nous voulons le produit scalaire le long de la deuxième dimension, nous fournissons donc un 2 pour la troisième entrée à dot.

dp = dot(C{1}(1:end-1,:), C{1}(2:end,:), 2); 

Nous utilisons cellfun pour effectuer cette opération sur chaque élément de réseau de cellules.

Exemple

C = {rand(10,2), rand(20,2), rand(30,2), rand(40, 2), rand(50,2)}; 
dots = cellfun(@(x)dot(x(1:end-1,:), x(2:end, :), 2), C, 'uniform', 0) 

    [9x1 double] [19x1 double] [29x1 double] [39x1 double] [49x1 double] 
+0

Merci. Mais cela me donnera un produit scalaire pour chaque matrice et aboutira à un vecteur nx1 (n est la longueur du tableau de cellules). Dans mon cas, je voudrais faire le produit scalaire pour 4 éléments à la fois. Donc, si C {1} = [20x2 double], je m'attendrais à avoir un tableau [19x1 double]. –

+0

@JameeLin Ok réponse est mise à jour pour tenir compte de cela. J'espère que cela fonctionne comme prévu maintenant. – Suever

+0

Cela fonctionne !! Merci beaucoup!! –