1

我有这个矩阵:

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中做到这一点?我听说循环非常糟糕,如果可以的话,我应该使用矩阵运算。

4

3 回答 3

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).

于 2013-06-12T18:25:27.640 回答
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 矩阵;toeplitz([a,b,c,d,e])您的子矩阵没有正确的格式。不过,您也许可以使用它来开始一些事情。

于 2013-06-12T18:31:49.420 回答
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。

于 2013-06-12T18:03:05.167 回答