变换矩阵和重复值

时间:2013-06-12 17:33:48

标签: matlab matrix

我有这个矩阵:

a1 a2 a3 a4 a5
b1 b2 b3 b4 b5
c1 c2 c3 c4 c5
d1 d2 d3 d4 d5
e1 e2 e3 e4 e5

我需要将其转换为这个矩阵:

a1 a2 a3 b1 b2 b3 c1 c2 c3
a2 a3 a4 b2 b3 b4 c2 c3 c4
a3 a4 a5 b3 b4 b5 c3 c4 c5
b1 b2 b3 c1 c2 c3 d1 d2 d3
b2 b3 b4 c2 c3 c4 d2 d3 d4
b3 b4 b5 c3 c4 c5 d3 d4 d5
c1 c2 c3 d1 d2 d3 e1 e2 e3
c2 c3 c4 d2 d3 d4 e2 e3 e4
c3 c4 c5 d3 d4 d5 e3 e4 e5

即。通过采用3x3矩阵并迭代旧矩阵,将其作为新矩阵中的新行。 我怎么能在matlab中做到这一点?我听说循环非常糟糕,如果可以,我应该使用矩阵运算。

3 个答案:

答案 0 :(得分:1)

如果您有权访问图像处理工具箱,则可以使用im2col,它甚至适用于符号变量

A = sym('A%d%d', [5 5]);
A = sym(A, 'real');

Subs = mat2cell(im2col(A, [3 1])', 3*ones(1,5));
Res = im2col(Subs, [3 1]);

Res是包含子矩阵的单元矩阵。

连接成矩阵:

reshape([Res{:}]', [9 9])

或如果它不符号,这也有效:cell2mat(Res)

答案 1 :(得分:0)

看看这段代码:

clear
clc

a1 = 1; a2 = 2; a3 = 3; a4 = 4; a5 = 5;
b1 = 11; b2 = 12; b3 = 13; b4 = 14; b5 = 15;
c1 = 21; c2 = 22; c3 = 23; c4 = 24; c5 = 25;
d1 = 31; d2 = 32; d3 = 33; d4 = 34; d5 = 35;
e1 = 41; e2 = 42; e3 = 43; e4 = 44; e5 = 45;

A = [a1 a2 a3 a4 a5; b1 b2 b3 b4 b5; c1 c2 c3 c4 c5; d1 d2 d3 d4 d5; e1 e2 e3 e4 e5];
B = zeros(9,9);

sizeA = size(A);
sizeB = size(B);

jj = 1;
kk = 1;

for ii = 1 : sizeB(1)    
    B(ii,1:sizeB(1)) = [A(kk, jj:jj+2) A(kk + 1, jj:jj+2) A(kk + 2, jj:jj+2)]
    jj = jj + 1;
    if mod(ii,3) == 0
        kk = kk + 1;
        jj = 1;
    end
end

我测试了你的情况,其中A是5x5,B是9x9。可能需要进行修改才能使用不同大小的A和B.

答案 2 :(得分:0)

你可以在一般意义上做到这一点,但它并不漂亮:

a = [a1, a2, a3, a4, a5];
b = [b1, b2, b3, b4, b5];
% etc.

% Rearrange your vector into a matrix configured how you want it
A = flipdim(toeplitz(a),1); % 5 x 5 matrix in our case
A = A(ceil(size(A,1)/2):size(A,1), ceil(size(A,2)/2):size(A,2)); % now 3 x 3

%%%
% Repeat similar process for b --> B, c --> C, etc.
%%%

% Build the resulting matrix up block-by-block
M = [A, B, C;
     B, C, D;
     C, D, E];

我无法找到一种推广M构造的好方法,不幸的是,使用toeplitz([a,b,c,d,e])形成一个toeplitz矩阵失败了;您没有为子矩阵获得正确的格式。不过,你或许可以用这个开始。