2010-09-05 134 views
4

我有一個〜100000/2矩陣。我想沿着列向下,平均每個垂直相鄰的值,並在兩個值之間插入該值。例如...在矩陣matlab中插入行

1 2 
3 4 
4 6 
7 8 

將成爲

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

我不知道是否有在matlab做這個簡潔的方式。我看了一下http://www.mathworks.com/matlabcentral/fileexchange/9984,但它似乎將矩陣中的所有行插入到另一個特定點處。顯然它仍然可以使用,但只是想知道是否有一個更簡單的方法。

任何幫助表示讚賞,謝謝。

回答

2

未經測試:

% 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

你需要周圍的括號[X; 1 0] + [1 0; X]。 – gary 2010-09-05 18:25:59

+0

修好了,謝謝! – 2010-09-05 18:28:04

+0

這裏唯一的問題是,它分別包含列中第一個值和最後一個值之前和之後的值。編輯:它做到了!謝謝! – random 2010-09-05 18:35:05

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;