Создать новую матрицу на основе диагонали и антидиагонали данной матрицы - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу создать матрицу B из матрицы A со следующими правилами:

  • Недиагональные элементы A подобны недиагональным элементам B.

  • Главная диагональ A является антидиагональю B

  • Антидиагональ A является главной диагональюиз B.

Например:

A = [ 1  2  3  4;
      7  8  9 10;
     13 14 15 16; 
     19 20 21 22 ];
B = [ 4  2  3  1;
      7  9  8 10;
     13 15 14 16;
     22 20 21 19 ];

Как я могу создать B с учетом A?

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Вот вариант с использованием eye, find и flip для генерации линейных индексов :

ind1 = find(eye(size(A)));
ind2 = flip(find(flip(eye(size(A)))));
B = A;
B([ind1 ind2]) = B([ind2 ind1]);

B =

     4     2     3     1
     7     9     8    10
    13    15    14    16
    22    20    21    19

А вот вариант вышеупомянутого, который использует только eye и flip для генерации логических индексов :

ind1 = eye(size(A), 'logical');
ind2 = flip(ind1);
B = A;
B(ind1) = flip(A(ind2));
B(ind2) = flip(A(ind1));

B =

     4     2     3     1
     7     9     8    10
    13    15    14    16
    22    20    21    19
0 голосов
/ 20 декабря 2018

Вы можете создать все индексы, тогда это одно назначение.

% Get size of square matrix A
n = size(A,1);
% Indicies are 1:n^2 by default
idx = 1:n^2;
% Swap diagonal and antidiagonal indices
idx( [1:(n+1):n^2, n^2-n+1:1-n:n] ) = [n^2-n+1:1-n:n, 1:(n+1):n^2];
% Use the indexing array to create B from A, reshape to be n*n
B = reshape( A( idx ), n, n );

Вывод для вашего примера A:

B =
     4     2     3     1
     7     9     8    10
    13    15    14    16
    22    20    21    19
0 голосов
/ 20 декабря 2018

Я подумал немного по-другому и пришел к выводу

A=[1 2 3 4;7 8 9 10;13 14 15 16; 19 20 21 22];;
n=size(A,1) ;
B=zeros(n,n) ;

for i=1:n
    for j=1:n
        if i==j
            B(i,j)=A(i,n-i+1);
        elseif j==n-i+1
            B(i,j)=A(i,i);
        else
            B(i,j)=A(i,j);
        end
    end 
end
B
0 голосов
/ 20 декабря 2018

Есть много способов достичь этих результатов, это всего лишь упражнение по индексированию.Вот один из многих способов достижения этого результата для любой квадратной матрицы размера n:

%% input
A=[ 1  2  3  4 ;
    7  8  9 10 ;
   13 14 15 16 ;
   19 20 21 22 ];

%% Calculate linear indices for the diagonal and antidiagonal
n=size(A,1) ;                   
idxdiag     = 1:(n+1):n^2 ;     % => idxdiag     = [1 6 11 16]
idxantidiag = n:(n-1):n^2-1 ;   % => idxantidiag = [4 7 10 13]

%% Generate B
B = A ;            % start with a simple copy (for the non-diagonal elements)

% Method 1: direct indice assignment
B(idxdiag)     = diag(fliplr(A)) ;  % Assign diagonal elements of B
B(idxantidiag) = flipud(diag(A)) ;  % Assign antidiagonal elements of B

% Method 2: summation
B([idxdiag idxantidiag]) = 0 ;
B = B + diag(diag(fliplr(A))) + fliplr(diag(diag(A))) ;

B =
     4     2     3     1
     7     9     8    10
    13    15    14    16
    22    20    21    19

Оба метода возвращают абсолютно одинаковую матрицу B.


Предлагаю вам ознакомиться с функцией MATLAB, используемой для понимания происходящего за сценой:

и могут быть прочитаны по адресу: Матричное индексирование в MATLAB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...