2013-05-05 8 views
1

Я работаю над нечеткими классификациями. Потому что я не настоящий разработчик программного обеспечения ... просто понял, что я не могу реализовать, в языке C, макс-мин композиции на матрицах.Состав матриц MaxMin

Я постараюсь быть более понятным.

Предположим, у вас есть квадратная матрица так же, как это:

float matrix[2][2] = { 
         { 1.0, 0.4 }, 
         { 0.4, 1.0 } 
        }; 

максиминимального состав "матрицы" сама по себе, yelds

result_matrix[2][2] = { 
         { 1.0, 0.4 } 
         { 0.4, 1.0 } 
         }; 

например

сначала выполнить

min(1.0, 0.4) = 0.4 /* first row */ 
min(1.0, 0.4) = 0.4 /* first col */ 

затем

max(0.4, 0.4) = 0.4, что это элемент в точке (0, 0) новой матрицы.

например.

min(1.0, 0.4) = 0.4; /* first row */ 
min(0.4, 1.0) = 0.4; /* second col */ 

max(0.4, 0.4) = 0.4; 

элемент в точке (0, 1)

Что мне нужно реализовать в C языке, является своего рода «строк на перевалы» проверить на матрице.

Я действительно не знаю, как это сделать.

Некоторые предложения?

Заранее спасибо.

ответ

0

Не могли бы вы быть более конкретными относительно того, какие строки/столбцы вы сравниваете? Если бы я точно знал, что вы сравниваете, и в каком порядке я мог бы помочь вам больше. Это то, что я могу дать вам до сих пор. Вот функция для нахождения минимального значения массива

float min(int n, float *array) 
{ 
    int i; 
    float minval; 

    minval = *array; 

    for (i=1; i<n;i++) 
    { 
     if (array[i] < minval) 
     minval = array[i]; 
    } 

    return minval; 
} 

Чтобы найти минимальное значение в первой строке вы будете использовать

x = min(2, *matrix); 

Для других строк

x = min(NUMCOLS, *matrix+row*NUMCOLS + column)); 

И в доступ к элементам матрицы по строкам по столбцам использует две вложенные петли

for (i = 0; i < 2; i++) 
    for (j = 0; j < 2; j++) 
     printf("%f\n", matrix[i][j]); 

Посмотрите на Row-major_order

0

Я думаю, это поможет.

«Алгоритм» должен вычислять каждый новый элемент новой матрицы.

Кстати ...

У вас есть входная матрица, такие как firstMatrix.

Шаг один: получить первый элемент из первой строки firstMatrix и первого элемента первой седловины из firstMatrix: firstMatrix[0][0] и firstMatrix[0][0]

Шага два: повторить «Шаг один» для каждой строки и Col из firstMatrix :

/* row */ 
temp_array_1[i] = firstMatrix[i][j] 

и

/* col */ 
temp_array_2[i] = firstMatrix[j][i] 

Шаг три:

for (i = 0; i < 4; i++) 
{ 
    if (temp_array_1[i] <= temp_array_2[i]) 
    { min_array[i] = temp_array_1[i]; } 

    else 
    { min_array[i] = temp_array_2[i]; } 
} 

Шаг четвертый: получите максимальное значение в min_array[i].

Здесь следует мой исходный код ...

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    int i; 

    int j; 

    float firstMatrix[4][4] = { 
           { 1, 0.6, 0.3, 0.8 }, 
           { 0.6, 1, 0.1, 0.4 }, 
           { 0.3, 0.1, 1, 0.5 }, 
           { 0.8, 0.4, 0.5, 1 } 
          }; 


    float max = 0.0; 

    float temp_array_1[4]; 

    float temp_array_2[4]; 

    float min_array[4]; 


     for (i = 0; i < 4; i++) 
     { 
     /* row */ 
     temp_array_1[i] = firstMatrix[0][i]; 

     /* col */ 
     temp_array_2[i] = firstMatrix[i][0]; 
     } 

     for (i = 0; i < 4; i++) 
     { 
      if (temp_array_1[i] <= temp_array_2[i]) 
      { min_array[i] = temp_array_1[i]; } 

      else 
      { min_array[i] = temp_array_2[i]; } 

      for (i = 0; i < 4; i++) 
      {   
        if (min_array[i] > max) 
        { max = min_array[i]; }   
      } 
     } 

    fprintf(stdout, "\nMax element: %.1f\n", max); 

    return 0; 
} 

Дело в том, что я не в состоянии «перебирать» это для каждого элемента firstMatrix.

Выходная матрица, которая выходит из этого столпотворения это:

outputMatrix[4][4] = { 
        { 1.0, 0.6, 0.5, 0.8 }, 
        { 0.6, 1.0, 0.4, 0.6 }, 
        { 0.5, 0.4, 1.0, 0.5 }, 
        { 0.8, 0.6, 0.5, 1.0 } 
        } 
+0

Это ответ или ответ Роберто Гомесу? Если последнее, вы должны отредактировать свой вопрос с помощью этой информации, а не публиковать его как новый ответ. – LittleBobbyTables

1

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

Вместо

resultMatrix[i][j] += firstMatrix[i][k] * firstMatrix[k][j]; 

мне нужно что-то вроде этого

resultMatrix[i][j] = MAX(MIN(firstMatrix[i][k], firstMatrix[k][j])); 

Где MIN(firstMatrix[i][k], firstMatrix[k][j]) это просто еще один массив.

думаю.

1

Решенный!

Здесь исходный код композиции max-min.

#include <stdio.h> 
#include <stdlib.h> 

float get_max(float a[], int num_elements); 

int main(int argc, char **argv) 
{ 
    int i; 

    int j; 

    int k; 

    float firstMatrix[4][4] = { 
           { 1, 0.6, 0.3, 0.8 }, 
           { 0.6, 1, 0.1, 0.4 }, 
           { 0.3, 0.1, 1, 0.5 }, 
           { 0.8, 0.4, 0.5, 1 } 
          }; 


    float resultMatrix[4][4]; 

    float min_array[4]; 

     for (i = 0; i < 4; i++) 
     { 
      for (j = 0; j < 4; j++) 
      { 
        for (k = 0; k < 4; k++) 
        { 
         if (firstMatrix[i][k] <= firstMatrix[k][j]) 
         { min_array[k] = firstMatrix[i][k]; } 

         else 
         { min_array[k] = firstMatrix[k][j]; } 

        resultMatrix[i][j] = get_max(min_array, 4);           
        } 

       fprintf(stdout, "%.1f ", resultMatrix[i][j]);     
      } 

     fprintf(stdout, "\n"); 
     } 

    return 0; 
} 

float get_max(float a[], int num_elements) 
{ 
    int i; 

    float max = 0.0; 

     for (i = 0; i < num_elements; i++) 
     { 
     if (a[i] > max) 
     { max = a[i]; } 
     } 

    return(max); 
} 
+1

Вам действительно не нужны три ответа на этот вопрос; вы должны отредактировать [этот ответ] (http://stackoverflow.com/a/16401683/334849) с содержимым этого ответа. – LittleBobbyTables

Смежные вопросы