reox
reox

Reputation: 5237

transform matrix and repeat values

I have this 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

and i need to transform it to this matrix:

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

i.e. by taking a 3x3 matrix and iterating over the old matrix putting it as a new row in the new matrix. How can i do this in matlab? I heard loops are very bad and if I can I should use matrix operations.

Upvotes: 1

Views: 247

Answers (3)

p8me
p8me

Reputation: 1860

If you have access to image processing toolbox you can use im2col which even works for symbolic variables too.

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 is a cell matrix containing the sub matrices.

To concatenate it into a matrix:

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

or if it's not symbolic this also works: cell2mat(Res).

Upvotes: 1

Engineero
Engineero

Reputation: 12948

You can do this in a somewhat general sense, but it is not pretty:

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];

I was unable to find a good way to generalize the construction of M, and unfortunately forming a toeplitz matrix using toeplitz([a,b,c,d,e]) fails; you do not get the right format for your sub-matrices. Still, you may be able to use this to start on something.

Upvotes: 0

m_power
m_power

Reputation: 3204

Take a look at this code :

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

I tested it for your case where A is 5x5 and B is 9x9. Might need to be modified to work with different size of A and B.

Upvotes: 0

Related Questions