Есть задача найти определитель матрицы. Есть N клиентов которые занимаются расчетами. Суть в том чтоб взять одну большую матрицу разбить на меньшые и отправить клиентам для обработки, а потом собрать результат в единое целое. Как правильно разбить матрицу при расчете определителя матрицы ?? Пока только один вариант придумал а именно: если размер матрицы четный то ее можно разбить на более мелкие матрицы одинакового размера. Рассчитать их определители. Из полученных определителей собрать новую матрицу, и рассчитать ее определитель. Как быть с матрицами размера не четного размера ? Или вообще нужен другой подход??
Както так надо считать: http://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C
XshStasX, используйте алгоритм приведения матрицы к верхнетреугольному виду и не мучайте себя... приходилось считать таким макаром матрицы 1000х1000 - все достаточно быстро...
gorodon ты имеешь ввиду чтоб под главной диагональю матрицы 0 были? Как тогда правильно разбить матрицу чтоб каждый клиент мог кусочек ее обработать?
У меня все в одном потоке работало и достаточно быстро. Но если хочется распараллелить, то надо не матрицу разбивать на куски и обрабатывать, а наоборот - действия над матрицей разбивать на части... Представим упрощенный алгоритм: for i=1 to N do for j=i+1 to N do k=a[j]/a As[j] = k*As[j]-As end; end; Где: As[j] = k*As[j]-As - действие над строкой for k=j to N do a[j][k] = k*a[j][k]-a[k] end; В данном алгоритме можно распараллелить действия над строками: for j=i+1 to N do k=a[j]/a As[j] = k*As[j]-As end; ... - разбить это на m частей: for j=i+1 to N2 .. for j=N3+1 to N3 ... for j=Nm+1 to N ... - каждый for будет выполняться в отдельном потоке (или, как вы выражаетесь - обрабатываться отдельным клиентом)