Логическая ошибка в MATLAB - PullRequest
       10

Логическая ошибка в MATLAB

0 голосов
/ 13 сентября 2010
a4 = 10*magic(4);
a5 = magic(5);
a4
a5

diag4 = sub2ind([4,4], 1:3,1:3);
diag5 = sub2ind([5,5], 1:3,1:3);
a5(diag5) = a4(diag4)    #Display changed contents
diag4   %#  Display diagonal of magic4
diag5  %# Display diagonal of magic5

a4(diag4)=a5(diag5) %# Recovering the original

Выходные данные

a4 =                     %# Display of original a4 magic square

   160    20    30   130
    50   110   100    80
    90    70    60   120
    40   140   150    10

a5 =               %#Display of original magic square
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

diag4 =
     1     6    11

diag5 =
     1     7    13

a5 =
   160    24     1     8    15
    23   110     7    14    16
     4     6    60    20    22
    10    12    19    21     3
    11    18    25     2     9

a4 =
   160    20    30   130
    50   110   100    80
    90    70    60   120
    40   140   150    10

Какова логика способа генерации diag4 и diag5?

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

Мне не совсем ясна ваша цель, но вот один из способов извлечь диагонали изображения RGB (диагональ 2D-матриц для каждого цветового канала):

A = rand(32,32,3);   %# it can be any 3D matrix (and not necessarily square)
[r c d] = size(A);
diagIDX = bsxfun(@plus, 1:r+1:r*c, (0:d-1)'.*r*c);
A( diagIDX(:) )

diagIDX будет иметь три строки, каждая из которых содержит (линейные) индексы диагональных элементов (по одному для каждого среза). Оттуда вы можете адаптировать его под свой код ...


Идея приведенного выше кода проста: возьмите 2D-матрицу, к диагональным элементам можно получить доступ с помощью:

A = rand(5,4);
[r c] = size(A);
A( 1:r+1:r*c )

затем в трехмерном случае я добавляю дополнительное смещение для достижения других срезов таким же образом.

0 голосов
/ 13 сентября 2010

Один из способов доступа к диагональным элементам матрицы (получить или назначить) - использовать sub2ind для поиска записей:

>> a = magic(4);
>> ind = sub2ind([4,4], 1:3,1:3);
>> a(ind) = rand(1,3)

a =

    0.6551    2.0000    3.0000   13.0000
    5.0000    0.1626   10.0000    8.0000
    9.0000    7.0000    0.1190   12.0000
    4.0000   14.0000   15.0000    1.0000

Второй пример:

% Replace the first 3 items in the diagonal of a5 by 
% the first 3 items in the diagonal of a4.
>> a4 = 10*magic(4);
>> a5 = magic(5);
>> diag4 = sub2ind([4,4], 1:3,1:3);
>> diag5 = sub2ind([5,5], 1:3,1:3);
>> a5(diag5) = a4(diag4)

a5 =

   160    24     1     8    15
    23   110     7    14    16
     4     6    60    20    22
    10    12    19    21     3
    11    18    25     2     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...