Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Как можно это сделать?Подкиньте хоть какую нибудь идею!



Партнер
 

Member
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Минск
DaVinci_79 2 матрицы реккурсивно перемножить или что? Может быть имеется в виду динамическое программирование, как наиболее эффективно перемножить некоторое количество матриц, чтобы произвести наименьшее число действий? А как 2 реккурсивно просто перемножить нужно подумать... (как сюда реккурсию засунуть, что-то очевидного ничего не придумывается)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Любой цикл можно сделать рекурсией, вопрос только в том, нужно ли...


 

Билли Бонс писал(а):
Любой цикл можно сделать рекурсией, вопрос только в том, нужно ли...


Да циклом это легко.Мне именно рекурсивно нужно.
Я сейчас пытаюся что нибудь придумать исходя из точки, что два вектора 1хN и Nx1 я знаю как перемножить. А вот как дальше развить рекурсию не догоняю. Есть какие нибудь идеи?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
DaVinci_79 Не понимаю твои затруднения. Если ты говоришь, что векторы умножать рекурсивно умеешь, то в чём проблема с матрицами? Короче, пример:
Код:
#include <iostream>

using namespace std;

const size_t M_SIZE = 3;
const size_t M_FULL_SIZE = M_SIZE * M_SIZE;

double matrix1[M_SIZE][M_SIZE] = { { 1.0, 2.0, -1.0 }, { 1.5, 0.0, 1.0 }, { -1.0, -3.5, 0 } };
double matrix2[M_SIZE][M_SIZE] = { { 3.0, 0.0, 2.0 },  { 0.0, 1.0, 2.0 }, { 1.0, -1.0, 2.5 } };
double matrix[M_SIZE][M_SIZE];

typedef double (*m_ptr)[M_SIZE];

void print_matrix( m_ptr matrix )
{
    for ( size_t i = 0; i < M_SIZE; ++i )
    {
        for ( size_t j = 0; j < M_SIZE; ++j )
            printf( "%g\t", matrix[i][j] );
        printf( "\n" );
    }
    printf( "\n" );
}

double rec_vec_mul( double* v1, double* v2, size_t counter = M_SIZE )
{
    if ( counter > 1 )
        return *v1 * *v2 + rec_vec_mul( v1 + 1, v2 + M_SIZE, counter - 1 );
    return *v1 * *v2;
}

void rec_matrix_mul( m_ptr m1, m_ptr m2, m_ptr res, size_t counter = M_FULL_SIZE )
{
    size_t i = ( M_FULL_SIZE - counter ) / M_SIZE,
           j = ( M_FULL_SIZE - counter ) % M_SIZE;
    res[i][j] = rec_vec_mul( &m1[i][0], &m2[0][j] );
    if ( counter > 1 )
        rec_matrix_mul( m1, m2, res, --counter );
}

int main()
{
    print_matrix( matrix1 );
    print_matrix( matrix2 );
    rec_matrix_mul( matrix1, matrix2, matrix );
    print_matrix( matrix );
}

Добавлено спустя 1 минуту, 30 секунд
З.Ы. Надеюсь, я правильно матрицы перемножаю, а то уже всю алгебру позабыл. :D


 

Member
Статус: Не в сети
Регистрация: 28.03.2006
Алгоритм Штрассена . Читать Кормена или Ахо.

_________________
Первый огонь был получен людьми из-за перегрева.
Пессимист отличается от оптимиста датой наступления конца света.


 

Aside писал(а):
Алгоритм Штрассена .

спасибо,помогло!!!:-)))


 

Member
Статус: Не в сети
Регистрация: 28.03.2006
DaVinci_79 писал(а):
спасибо,помогло!!!

алилуя, только кому этот алгоритм сдался, разве что для теории.

_________________
Первый огонь был получен людьми из-за перегрева.
Пессимист отличается от оптимиста датой наступления конца света.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan