Заготовки для С++
не жалкоУже на размерности= 15 глохнет.
Может у кого-нить все-таки есть нормальная прога.
Или может ошибку найдете:
#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>
#include <math.h>
#define N 15 // matrix size
int matrix[N][N];
заполняю матрицу
void ini_matrix(int *matrix, int size)
{int k=1;
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
*(matrix+i*size+j)=fmod(j+k,N);
k++;
}
}
вывожу её
void show_matrix(int *matrix, int size) // this functions displays matrix
{
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
printf("%d ",*(matrix+i*size+j;
printf("\n");
}
printf("\n");
}
нахожу определитель
int Det(int *matrix, int const size)
{
int *submatrix;
int det=0;
if (size>1)
{
submatrix=(int *)malloc(sizeof(int)*(size-1)*(size-1;
for (int i=0;i<size;i++)
{
// creating new array (submatrix)
for (int j=0;j<size-1;j++)
for (int k=0;k<size-1;k++)
*(submatrix+j*(size-1)+k)=*(matrix+(j+1)*size+(k<i?k:k+1;
det+=*(matrix+i)*(i/2.0==i/2?1:-1)*Det(submatrix,size-1);
}
free(submatrix);
} else det=*matrix;
return det;
}
собсно сама прога
void main(void)
{
ini_matrix(matrix[0], N);
show_matrix(matrix[0],N);
// calculating determinante and displaying the result
printf("det A = %d",Det(matrix[0],N;
}
если хорошо, то скорее всего на 15 уже переполнение идет..слишком большие числа, наверное
а числа небольшие от 0 до (размерность-1)
глохнетэто как?
кстати, зачем изобретать велосипед и не воспользоваться lu-разложением? твоя прога будет значительно медленнее работать...
другое дело, если пытаться найти определитель не портя матрицу, используя O(n) доп. памяти и разумное число операций - интересно, возможно ли?
предлагаю сделать переменную Det типом double. хотя на размерности 15 и double может не выдержать, но попробывать стоит
У чувака рекурсионный вызов вычисления определителя на порядке 15 дает 15!=1307674368000 вызовов процедуры Det, что естественно переполняет стек.
Приводи матрицу линейными преобразованиями к треугольному виду, чтобы выполнялось условие a_ij=0, i>j
Там вглубь 15 вызовов. С чего стеку переполняться-то?
i/2.0==i/2я плакал
Если сама процедура с маллоками, циклами и прочей херней работает ну пусть одну миллисикунду, то твоя прога несколько веков этот определитель считать будет. Чем тебе не подошла ссылка-то?
потом умножь это время на 15, и получишь примерно сколько будет считать для 15.
Стек вроде переполниться не должен, и если память правильно выделяется - освобождается, то ошибок времени исполнения (таких как переполнение стека) быть не должно (хотя может быть изза фрагментации - хз). Но алгоритм медленный, во всем мире принято считать хотябы по гауссу
k<i?k:k+1
i/2.0==i/2?1:-1
а вот второе - это хитрозадая проверка i на чётность
Вроде столько времени пргаю, а такой штукой никогда не пользовался (expr)?(expr):(expr)
k+(k>=i)
второе на
1-2*(i%2)
added: оператор ? : полезная вестчь
две минуты назад такую вставил
PS. Рекурсивный алгоритм вычисления det - полное говно. Ботай метод Гаусса.
метод Гусса отменили?
ну нахера искать определитель через миноры?
нет, ну нахрена это может пригодиться, я не понимаю......
позже: опередили
А какие операторы ты сравнивал?
Ср. a+b+c+d+e+f vs (+ a b c d e f).
(+ a b c d e f)а можно ли там сложить все элементы массива одной командой?
А это очень востребованно в задачах, с которыми программисты сталкиваются?
Смотря что считать одной командой...
(loop for x across array summing x)
unsigned char * ptr;
*int*)&ptr) = 0xB8000;
strcpy(ptr, "lliisspp ssoosseett");
ахуенный аргумент
в паскале это делается еще изящнее. Там даже стркопи вызывать бы не пришлось, просто юзай absolute. Правда, у него нет оператора ?:
Ну, в некоторых разновидностях сей было ключевое слово _at_, с точно таким же эффектом.
Есть ли для Lisp какие-либо средства асинхронного сетевого программирования по типу
http://twistedmatrix.com/projects/core/documentation/howto/a... ?
(loop for x across array summing x)
sum = reduce(lambda x,y:x+y, list, 0)
это короче
ЗЫ а как в лиспе будет сложить сумму кубов:?
Чтобы посчитать сумму кубов надо вместо "summing x" написать "summing (expt x 3)" или "summing (* x x x)"
Я так понял, что лисп сливает по удобочитаемости даже ЦэПлюсПлюсу
это петон был
а вот второе - это хитрозадая проверка i на чётность
Не столько хитрозадая, сколько очень неэффективная. Самым эффективным вариантом было бы завести отдельную переменную под флаг и в теле цикла делать ей ^=~1 (это на подходящей архитектуре).
1-2*(i%2)Это не по-отцовски, минимум 3 цикла.
можно так:
(reduce #'+ mylist) - это короче чем в питоне
> ЗЫ а как в лиспе будет сложить сумму кубов:?
я умею так:
(reduce #'+ (mapcar #'(lambda (x) (* x x x mylist
i % 2 == i & 1
strcpy(ptr, "lliisspp ssoosseett");
Ты неправильно пишешь в видеопамять
Там толи чётные, толи нечётные байты содержат атрибуты символа -- цвет + цвет фона (+ мигание, если выставлен соответствующий атрибут контроллера)
Бррр... Лучше уж (reduce #'+ mylist :key (lambda (x) (* x x x. mapcar работает только со списками, а не с массивами.
+1, i&1 - самая экономная проверка
Именно поэтому каждая буковка повторяется два раза. Типа они разноцветные
i % 2 == i & 1
Ты не поверишь, я знаю об этом.
Мой пост был про то, что использование этого
1-2*(i%2)данной ситуации неэффективно, и требует как минимум три цикла (такта) процессора. В то время как введя переменную sign под знак можно обойтись одним тиком в теле for'а так:
sign^=~1; (До for'а, естественно надо объявить register sign = 1;)
+1, i&1 - самая экономная проверка
Ёлы-палы, вы все прикалываетесь что ли?
1. самая эффективная проверка доступна только с ассемблером -- это тест флага чётности результата сразу после добавления 1 к i (цикл придётся слегка модифицировать)
2. ему не нужна проверка чётности, ему нужен знак минора, а вычислять знак минора через if -- очень неэкономно
3. вариант вычисления знака минора за один такт я уже привёл, быстрее работать никакой вариант не будет.
Именно поэтому каждая буковка повторяется два раза. Типа они разноцветные
А, так это не бага -- это фича!
Я-то думал надо "l\x..i\x..s\x.. ..."
А вообще говорить об эффективности реализации при таком неэффективном алгоритме - это
не просто прикалываться, скорее болезнь.
---
...Я работаю...
Оставить комментарий
nogala
У кого- нить есть готовые програмки? Интересует прога для вычисления определителя n*n.Поделитесь, если не жалко