2010-09-05 8 views
4

J'ai une matrice ~ 100000/2. Je voudrais descendre les colonnes, faire la moyenne de chaque valeur adjacente verticalement, et insérer cette valeur entre les deux valeurs. Par exemple ...Insertion de lignes dans la matrice MATLAB

1 2 
3 4 
4 6 
7 8 

deviendraient

1 2 
2 3 
3 4 
3.5 5 
4 6 
5.5 7 
7 8 

Je ne sais pas s'il y a un moyen laconique de le faire dans Matlab. J'ai jeté un oeil à http://www.mathworks.com/matlabcentral/fileexchange/9984 mais il semble insérer toutes les lignes dans une matrice dans l'autre à un point spécifique. Évidemment, il peut toujours être utilisé, mais je me demandais simplement s'il y a un moyen plus simple.

Toute aide est appréciée, merci.

Répondre

2

Untested:

% Take the mean of adjacent pairs 
x_mean = ([x; 0 0] + [0 0; x])/2; 
% Interleave the two matrices 
y = kron(x, [1;0]) + kron(x_mean(1:end-1,:), [0;1]); 
+2

Vous devez parenthèses autour de [x; 1 0] + [1 0; X]. – gary

+0

Correction, merci! –

+0

Le seul problème ici est qu'il inclut des valeurs avant et après les première et dernière valeurs dans la colonne, respectivement. Edit: C'est ce qu'il a fait! Merci! – random

0
octave-3.0.3:57> a = [1,2; 3,4; 4,6; 7,8] 
a = 

    1 2 
    3 4 
    4 6 
    7 8 

octave-3.0.3:58> b = (circshift(a, -1) + a)/2 
b = 

    2.0000 3.0000 
    3.5000 5.0000 
    5.5000 7.0000 
    4.0000 5.0000 

octave-3.0.3:60> reshape(vertcat(a', b'), 2, [])'(1:end-1, :) 
ans = 

    1.0000 2.0000 
    2.0000 3.0000 
    3.0000 4.0000 
    3.5000 5.0000 
    4.0000 6.0000 
    5.5000 7.0000 
    7.0000 8.0000 
1
%# works for any 2D matrix of size N-by-M 
X = rand(100,2); 

adjMean = mean(cat(3, X(1:end-1,:), X(2:end,:)), 3); 

Y = zeros(2*size(X,1)-1, size(X,2)); 
Y(1:2:end,:) = X; 
Y(2:2:end,:) = adjMean; 
Questions connexes