Упрощение таблицы четырехмерных правил в Matlab: адресация строк и столбцов каждого измерения - PullRequest
2 голосов
/ 01 июня 2010

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

В 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-таблицей.

1 Ответ

1 голос
/ 02 июня 2010

Я не уверен, что это то, о чем вы спрашиваете, но вот как проверить, совпадают ли значения в двух строках друг с другом или, если не совпадают, то по крайней мере один равен 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

для второго и так далее

...