Выберите диагональные элементы матрицы в MATLAB - PullRequest
9 голосов
/ 03 апреля 2011

Рассмотрим следующую матрицу в MATLAB:

01 02 03 04 05 06 07

08 09 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30 31 32 33 34 35

36 37 38 39 40 41 42

43 44 45 46 47 48 49

Я должен генерировать направленные вариограммы для таких 7 × 7 окон (движущихся) изображения. Я буду использовать nlfilter для процесса, но для разработки функции для вычисления вариограмм я не могу решить, как выбирать элементы в окне. Например, когда я рассматриваю центральное значение 25, в направлении EW я должен учитывать только 25, 26, 27 и 28; в направлении NE я должен учитывать только 25, 19, 13 и 07, когда выбрана задержка 1. Есть ли какая-либо стандартная команда для этого?

Ответы [ 3 ]

8 голосов
/ 18 января 2013

Вы также можете сделать это так:

A = eye(5);
v = A(1:size(A,1)+1:end);

в результате

v = [1 1 1 1 1]
3 голосов
/ 03 апреля 2011

Вы можете написать функцию, чтобы легко получить эти элементы самостоятельно:

A = [01 02 03 04 05 06 07
     08 09 10 11 12 13 14
     15 16 17 18 19 20 21
     22 23 24 25 26 27 28
     29 30 31 32 33 34 35
     36 37 38 39 40 41 42
     43 44 45 46 47 48 49];

c = (size(A)+1)/2;
EW = A(c(1),c(2):end)
NE = diag(A(c(1):-1:1,c(2):end))

Просто напишите этот код в функции (предпочтительно в m-файле), выполните свою операцию и передайте результат обратно.

Функция diag возвращает диагональные элементы матрицы (или возвращает диагональную матрицу при передаче вектора).

2 голосов
/ 16 января 2015

Это матричное решение (не для MATLAB) предположим, матрица AxB =

[01 AA 03 04 05 06 07
 08 09 AA 11 12 13 AA
 AA 16 17 AA 19 AA 21
 22 AA 24 25 AA 27 28
 AA 30 AA 32 33 34 35
 36 AA 38 AA 40 41 42
 43 44 AA 46 AA 48 49];

в этой матрице мы хотим непрерывно 3 раза искать АА по диагонали.

Решение: - шаг 1 для всей матрицы мы должны создать 4 отдельных цикла для непрерывного поиска внешнего вида AA 3 раза

enter image description here

Я добавляю метод, с помощью которого пользователь может выполнить поиск по всему циклу и найти элемент.

 local function check_win( matrx_table)

local counter = 1
local term = "AA"
local D = 1

-- for horizontal check for win---
for i = 1, no_rows, 1 do
    for j= 1, no_Columns, 1 do
        if((j+1) <= no_Columns) then             
            if(table_mXn[i][j] == term and table_mXn[i][j+1] == term)then
                counter = counter + 1;
            else
                counter = 1
            end               
            if(counter == 3)then
                return counter
            end               
        end
    end             
end

counter = 1
-- for vertical check for win--
for i = 1, no_Columns, 1 do
    for j= no_rows, 1, -1 do
        if((j-1) >= 1) then             
            if(table_mXn[j][i] == term and table_mXn[j-1][i] == term)then
                counter = counter + 1;
            else
                counter = 1
            end    
            if(counter == 3)then
                return counter
            end               
        end
    end             
end

counter = 1
D = 1
-- for diagonol  left half check for win in figure loop 1--
for m = 1, no_rows, 1 do
    D = 1
    for i =m, no_rows,1 do
        if(i+1 <= no_rows and D+1 <= no_Columns)then
            if(table_mXn[i][D] == term and table_mXn[i+1][D+1] == term)then
                counter = counter + 1;
                print("hhhhh")
            else
                counter = 1
            end               
            if(counter == 3)then
                return counter
            end     
            D = D + 1
        end
    end
end

counter = 1
D = 1
-- for diagonol  right half check for win in figure loop 2--
for m = 1, no_rows, 1 do
    D = m
    for i =1, no_rows,1 do
        if(i+1 <= no_rows and D+1 <= no_Columns)then
            if(table_mXn[i][D] == term and table_mXn[i+1][D+1] == term)then
                counter = counter + 1;
                print("hhhhh")
            else
                counter = 1
            end               
            if(counter == 3)then
                return counter
            end     
            D = D + 1
        end
    end
end

counter = 1
D = 1
-- for diagonol  left half check for win in figure loop 3--
for m = 1, no_rows, 1 do
    D = no_Columns
    for i =m, no_rows,1 do
        if(i+1 <= no_rows and D-1 >= 1)then
            if(table_mXn[i][D] == term and table_mXn[i+1][D-1] == term)then
                counter = counter + 1;
                print("hhhhh")
            else
                counter = 1
            end               
            if(counter == 3)then
                return counter
            end     
            D = D - 1
        end
    end
end

counter = 1
D = 1
-- for diagonol  left half check for win in figure loop 4--
for m = no_Columns, 1, -1 do
    D = m
    for i =1, no_rows,1 do
        if(i+1 <= no_rows and D-1 >= 1)then
            if(table_mXn[i][D] == term and table_mXn[i+1][D-1] == term)then
                counter = counter + 1;
                print("hhhhh")
            else
                counter = 1
            end               
            if(counter == 3)then
                return counter
            end     
            D = D - 1
        end
    end
end

end

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

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