Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2016, 12:56   #1
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию Язык Си. Вычисление параметра отбора матриц. Не хватает мощности. Помогите посчитать

Вычисляется коэффициент отбора матриц, который из 20000 матриц отбирает матриц в пределах от 800 до 1600, матрицы размерности 34 на n, где n=2..100, для каждого n нужно посчитать этот коэффициент. Помогите посчитать или оптимизировать код.

Код:
#include <stdio.h>                
#include <locale.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main()
{
	//srand(time(NULL)); 
	int l=20000,k=34; 
	int c=2000;                             
unsigned int timer;
int p=1,n,i1,i2,i3,q;
int flag,flag1,flag2=0; 
double dd,D0,D;	
double a;
for (n=2; n<=100; n++)
{
    int H[k][n];
    for (a=0.90; a>=0.5; a=a-0.00015)
    {
        p=1;
        D0=a*sqrt(k*n);
         int ***M=(int ***)malloc(c * sizeof(*M));
	 for (i2=0; i2<c; i2++)
	{
	   M[i2]=(int **)malloc(k * sizeof(*M[i2]));
           for (i3=0; i3<k; i3++)
	   {
	  	M[i2][i3]=(int *)malloc(n * sizeof(*M[i2][i3]));
           }
        }
    
        for (i2=0; i2<k; i2++) //первая матрица,которую сразу берём в отобранные  
       {
          for (i3=0; i3<n; i3++)
         {
         M[0][i2][i3]==rand()%2;         
         }
       }

   for (i1=1; i1<l; i1++)       
  {
      for (i2=0; i2<k; i2++)  
      {
        for (i3=0; i3<n; i3++)
        {
        H[i2][i3]=rand()%2;    
        }
      }
	
flag=999;
flag1=0;

      for (q=0; q<p; q++)
     { 
        dd=0; 
        for (i2=0; i2<k; i2++)  
        { 
	   for (i3=0; i3<n; i3++)
	   {
           dd=dd+pow((M[q][i2][i3]-H[i2][i3]),2);
           }
         D=sqrt(dd);
	 if (D>=D0) break;			
        }
					
       D=sqrt(dd);  
       if (D<D0)  
       { 
	flag=0;
	break;
       }      
     }  
      
      if ((flag==999))       
      {
        for (i2=0; i2<k; i2++)  
        {
           for (i3=0; i3<n; i3++)
           {
	  M[p][i2][i3]=H[i2][i3];
           }
        }
        p++;  //сколько матриц отобрано                 
       } 

      if (p>1600) break; 
     }


     for (i2=0; i2<c; i2++)
    {
       for (i3=0; i3<k; i3++)
      {
       free(M[i2][i3]);
      }  
    free(M[i2]);
    }
     free(M);

      if ((p>=800)&&(p<=1600)) {flag2=999;break;} 
  }

     if(flag2==999)
    {
     printf("n = %d\n",n);
     printf("a = %.5f\n",a);   
     printf("number of matrices = %d\n",p);
     printf("\n");
    } 
    flag2=0;
}


timer=(clock() / CLOCKS_PER_SEC); 
printf("time = %d\n",timer);
return 0;
}

Последний раз редактировалось Ar2emiS; 09.11.2016 в 15:14.
Ar2emiS вне форума Ответить с цитированием
Старый 09.11.2016, 14:39   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

что именно не так? памяти не хватает? слишком долго работает? и код отформатировал бы, читать же невозможно
GreenWizard вне форума Ответить с цитированием
Старый 09.11.2016, 15:03   #3
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

Слишком долго работает. Для n=2..30 считал коэффициенты около 15 часов.
Ar2emiS вне форума Ответить с цитированием
Старый 09.11.2016, 15:15   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Ar2emiS Посмотреть сообщение
Слишком долго работает. Для n=2..30 считал коэффициенты около 15 часов.
Код приведи в порядок и напиши суть идеи (что это за матрицы? что за метрики?), а там попытаемся оптимизировать
и это задание или личная идея какая-то?
GreenWizard вне форума Ответить с цитированием
Старый 09.11.2016, 15:28   #5
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

Матрицы из 0 и 1, различие между матрицами рассчитывается как расстояние между матрицами в евклидовом пространстве (D=sqrt(sum(sum(m1(i,j)-m2(i,j)))) )
Максимальное расстояние между матрицами равно D0=sqrt(k*n), то есть если рассмотреть две матрицы, одну полностью из 0,а вторую из 1. Но в общем случае, когда матрица заполнена случайным образом из 0 и 1,то ввожу параметр а, который ,очевидно меняется от 0 до 1, но этот интервал, можно урезать от 0.5 до 0.9. Тогда расстояние,которое обеспечивает отбор нужного количества матриц, представлена как D0=а*sqrt(k*n).
Условие отбора матриц D>D0.
Задача состоит в том,что найти параметры а для всех n.
Ar2emiS вне форума Ответить с цитированием
Старый 09.11.2016, 15:35   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1) У тебя ошибки выдаёт? У меня компилятор новый, поэтому он может реагировать на то, на что твой не стал бы (я это к тому, что может это не ошибки, а отличие стандартов, поддерживаемых компиляторами):

1.jpg


2) Попробуй узнать уское место в программе... Т.е. запусти её, а потом в любое время (но не сразу) приостанови (останови методами отладки):

2.jpg


Но только не один раз, а нужна статистика остановов (и в разное время от запуска программы).

А ты в чём программируешь? В какой среде?
ura_111 вне форума Ответить с цитированием
Старый 09.11.2016, 15:39   #7
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

1) ошибок не выдает. Да, там одиночное равно.
pelles c
Ar2emiS вне форума Ответить с цитированием
Старый 09.11.2016, 15:49   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

По идеи, расстояние между матрицами А и В можно выразить через их расстояние до "нулевой матрицы", а это расстояние можно найти при создание матриц (и хранить "рядом" с матрицей).... расстояние сведётся к sqrt(dA * dA + dB * dB), что намного быстрее "поэлементного" вычитания матриц....... т. к D нужно только тут, то хранить можно только его квадрат, что ещё немного ускорит процесс
Увы, остальное я не совсем понял, поэтому пока только это

Последний раз редактировалось GreenWizard; 09.11.2016 в 15:51.
GreenWizard вне форума Ответить с цитированием
Старый 09.11.2016, 15:52   #9
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

спасибо, рассмотрю и этот вариант.
Ar2emiS вне форума Ответить с цитированием
Старый 09.11.2016, 15:57   #10
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1) Я посмотрел, вроде твой pelles c отладку не поддерживает (ну разве что, для запуска программы, можешь попробовать "F5" . Появится ли кнопка приостановить программу?)

2) Подсчитай сколько памяти займёт программа в самый нагруженный момент (типы данных у тебя есть. количество элементов в массивах - тоже, количество массивов - тоже). Сравни со своей оперативкой.

3) Запусти программу и Мониторинг ресурсов одновременно (я не знаю твою операционку, но обычно Ctrl+Alt+Dell). Может у тебя не хватает памяти для размещение всех этих массивом?
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
посчитать количество нулевых элементов двух матриц с помощью функции. Паскаль gravitono Паскаль, Turbo Pascal, PascalABC.NET 2 18.04.2016 17:22
Перевод мощности в плотность мощности ImmortalAlexSan Свободное общение 9 20.02.2014 22:45
Нуждаюсь, язык С, С числовой множества A мощности n выбрать все подмножества, сумма элементов каждого из которых лежит в пределах FYNZIK Помощь студентам 0 16.02.2014 21:00
С++ Вычисление матриц VladJAy Помощь студентам 2 10.12.2012 00:04
Вычисление матриц (delphi) artimed Помощь студентам 0 16.05.2012 13:21