Упрощение четырехмерной таблицы правил в Matlab: адресация строк и столбцов каждого измерения

В настоящее время я пытаюсь автоматически сгенерировать набор нечетких правил для набора наблюдений, которые содержат четыре значения для каждого наблюдения, где каждое наблюдение будет соответствовать состоянию (хороший пример - данные Фишера по радужной оболочке).

В Matlab я создаю четырехмерную таблицу правил, в которой одна ячейка (a, b, c, d) будет содержать соответствующее состояние. Чтобы уменьшить таблицу, я использую метод Хонга и Ли. проверки сходства строк и столбцов, но мне трудно понять, как обращаться к строкам и столбцам третьего и четвертого измерений. Из метода я понимаю, что каждое измерение рассматривается индивидуально, и если правило верно, таблица упрощается. Правила слияния следующие:

  1. Если все ячейки в соседних столбцах или строках одинаковы.
  2. Если две ячейки совпадают или одна из них пуста в соседних
    столбцах или строках и хотя бы одна ячейка в обеих не пуста.
  3. Если все ячейки в столбце или строке пусты, а ячейки в двух
    соседних столбцах или строках совпадают, объедините эти три ячейки.
  4. Если все ячейки в столбце или строке пусты, а ячейки в двух
    соседних столбцах или строках одинаковы или хотя бы одна из них пуста, объедините эти три ячейки.
  5. Если все ячейки в столбце или строке пусты и если все непустые
    ячейки в столбце или строке слева имеют одну и ту же область, а все непустые ячейки в столбце или строке справа имеют того же региона, но отличного от ранее упомянутого региона, объедините эти три столбца в две части.

Теперь немного запутанного. Простая проверка того, совпадает ли вся строка/столбец с соседней (правило 1), кажется достаточно простой:

if (a,:,:,:) == (a+1,:,:,:)
   (:,b,:,:) == (:,b+1,:,:)
   (:,:,c,:) == (:,:,c+1,:)
   (:,:,:,d) == (:,:,:,d+1)

это правильно?

но чтобы проверить, совпадают ли элементы в строке/столбце или равны нулю (правила 2 и 4), я немного теряюсь. Будет ли это что-то в этом роде:

for a = 1:20
    for i = 1:length(b)
        if (a+1,i,:,:) == (a,i,:,:)
        ...
        else if (a+1,i,:,:) == 0
        ...
        else if (a,i,:,:) == 0      etc.

и для третьего и четвертого измерений:

for c = 1:20
    for i = 1:length(a)
        if (i,:,c,:) == (i,:,c+1,:)
        ...
        else if (i,:,c+1,:) == 0
        ...
        else if (i,:,c,:) == 0      etc.

for d = 1:20
    for i = 1:length(a)
        if (i,:,:,d) == (i,:,:,d+1)
        ...
        else if (i,:,:,d+1) == 0
        ...
        else if (i,:,:,d) == 0      etc.

даже любая помощь с четырехмерными массивами была бы полезна, поскольку меня так смущает мысль о более чем трех! Я бы посоветовал вам посмотреть на статью, чтобы понять, что я имею в виду - они сами использовали данные Iris, но привели только пример с 2D-таблицей.


person Cate    schedule 01.06.2010    source источник
comment
пусто так же, как == 0? В Матлабе они разные   -  person Marc    schedule 02.06.2010
comment
значение пусто состоит в том, что ячейка в этой позиции в таблице правил не содержит значения состояния, поэтому в этом случае пусто == 0.   -  person Cate    schedule 02.06.2010


Ответы (1)


Я не уверен, что это то, о чем вы спрашиваете, но вот как проверить, совпадают ли значения в двух строках друг с другом или, если они не совпадают, хотя бы одно равно 0

table(a,:,:,:) == table(a+1,:,:,:) | table(a,:,:,:) == 0 | table(a+1,:,:,:) = 0;

если вы хотите быть действительно умным, но несколько загадочным,

(diff(table, [], 1) == 0) | table(1:(end-1),:,:,:) == 0 | table(2:end, :,:,:) == 0

для первого измерения

(diff(table, [], 2) == 0) | table(:,1:(end-1),:,:) == 0 | table(:,2:end, :,:) == 0

на второй и так далее

person Marc    schedule 02.06.2010
comment
Это довольно загадочно, но, судя по всему, это может сработать, спасибо. Что может быть лучшим (и более простым) вопросом: как мне получить доступ к первому элементу третьего и четвертого измерений, учитывая, что первый элемент первого есть (a,1,:,:), второй (1,b ,:,:) так далее? - person Cate; 02.06.2010
comment
На самом деле, это проверяет всю строку/столбец на предмет того, что она пуста в целом, не так ли? Моя проблема заключается в проверке отдельных ячеек в соседних строках/столбцах, чтобы убедиться, что они совпадают или пусты; если для всех ячеек строки/столбца либо совпадают, либо хотя бы одна из них пуста, то две строки/столбца могут быть объединены. - person Cate; 02.06.2010
comment
== выполняет сравнение элементов, поэтому [1 2 3 4 5] == [5 4 3 2 1] дает [0 0 1 0 0] Я не уверен, что вы спрашиваете в своем первом комментарии. Чтобы получить доступ к отдельному элементу массива из 4 d, arr(i,j,k,m), чтобы получить все элементы, которые имеют первые 3 индекса == i,j,k, arr(i,j,k,:) . и т.п. - person Marc; 03.06.2010
comment
Я просто сказал, что в этой матрице пустая ячейка содержит 0. Проверка элемента за элементом == 0 вернет 1, если все содержат 0, и вернет 0, если нет. Однако мой другой вопрос требует уточнения: для доступа к первому элементу 1stD в 2D-матрице = (1,1), второму = (1,2). Для доступа к первому элементу 2ndD в 2D-матрице = (1,1), второму = (2,1). Теперь, если бы у меня было 3D, первым элементом 3rdD было бы (1, :, 1), что давало бы все значения 2ndD, соответствующие первой строке. Так как же получить доступ к первому из 4D? (1,:,:,1)? (:,1,:,1)? (:,:,1,1)? что-то другое? Спасибо - person Cate; 03.06.2010
comment
Проверка поэлементно == 0 вернет 1, если все содержат 0: нет, x == 0 вернет матрицу того же размера, что и x, с 1 везде, где x == 0, и 0 в противном случае. Попытайся. Назовите 1-е измерение строкой, 2-е измерение — столбцом, а 3-е измерение — плоскостью. arr(1,:,:) возвращает двумерный массив элементов из первой строки arr(:,1,:) возвращает двумерный массив элементов из первого столбца arr(:,:,1) возвращает двумерный массив элементов from the first plane arr(1,:,1) — это одномерный вектор элементов из первой строки и первой плоскости и т.д. - person Marc; 03.06.2010
comment
У меня есть, и я думаю, что я не достаточно ясно выразился. if(x == 0) проверит, равен ли каждый элемент x 0, и если это действительно так, он вернет 1 и продолжит выполнение оператора if. Если нет, то условие не выполняется и ничего не происходит. Вот как я проверяю, пуста ли вся плоскость для этого измерения, т.е. if(1,:,:,:)==0 и т. д. говорит мне, могу ли я удалить эту строку. И я могу понять трехмерные матрицы, но в четырехмерной матрице я не уверен. Я думаю, может быть, мой вопрос слишком сложен, чтобы ответить кратко! - person Cate; 04.06.2010