Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с матрицами
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Neonig
Здравствуйте.
Есть задание - получить транспонированную матрицу через хитрый такой алгоритм, но суть сейчас не в получении этой матрицы, а в реадизации одной из составляющих алгоритма - суммированию всех столбцов и нахождению наибольшей сумму. Суть в том, что я делаю некий цикл который должен в массив заносить сумму из полученных заранее индексов каждого столба в одномерном массиве, но он считает только один столбец, когда же я пытаюсь перевести его на суммирование каждого столбца и занесение значений в массив - вылетают несуразные ошибки, ассемблерные листинги и прочее ... поясните пожалуйста где я допустил оплошность...


#include <stdio.h>
#include <stdlib.h>
#define sym_null 0
#define max_step_k 10
#define matrix_size 4

static int all_size = 0;
static int global_count = 0;

int* once_matrix_func(void)
{
int* once_matrix;
int* main_deag;
int count_one = 0;
int count_two = 0;
int count_three = 0;
int start_position = 0;
float del;

all_size = matrix_size * matrix_size;
once_matrix = (int*)malloc(sizeof(int)*all_size);
main_deag = (int*)malloc(sizeof(int)*all_size);


for(count_one = 0; count_one < all_size; count_one += 1)
{
if (count_one == (start_position))
{
start_position = (start_position + matrix_size+1);
main_deag[count_three] = count_one;
count_three++;
once_matrix[count_one] = 1;
}
else
once_matrix[count_one] = 0;
}

printf("%s\n", "Our once matrix:");

for(count_two = 0; count_two < all_size; count_two +=1)
{

del = count_two % matrix_size;
if (del == 0)
{
printf("\n");
}
printf("%2d", once_matrix[count_two]);

}
return once_matrix;
}

int* matrix_eqw(int* matrix_one, int* matrix_two)
{
/* int count_one = 0;
int count_two = 0;
int count_three = 0;
int prom_perem = 0;
int* rezult_matrix;

rezult_matrix = (int*)malloc(sizeof(int)*all_size);

for(count_one = 0; count_one <= all_size; count_one +=1)
{
for (count_two = 0; count_two <= matrix_size; count_two +=1)
{
rezult_matrix[count_one] += matrix_two[prom_perem]*matrix_one[count_one];
prom_perem += matrix_size;
}
}

for(count_three = 0; count_three <= all_size; count_three +=1)
{
printf("%d\n", rezult_matrix[count_three]);
}

return rezult_matrix;*/
return 0;
}

/*
int maximum(int* once_matrix)
{
int count_one;
int count_two;
int max;

max = once_matrix[0];
for(count_one = 0; count_one <= matrix_size-1; count_one +=1)
{
if max < once_matrix[count_one]
}

}*/

int max_func(int* once_matrix)
{
int count_one = 0;
int count_two = 0;
int count_three = 0;
int count = 0;
int count2 = 0;
int max[255];
int once[255];
int vrem_count;
int mas_one[255];
int t = 0;
int j = 0;
int vrem = 0;
float del = 0.0;


for(count_one = 0; count_one <= all_size-1; count_one +=1)
{
mas_one[count_one] = 0;
once[count_one] = 1;
}

once[0] = 12;
once[4] = 5;

printf("\n");
printf("%d ", "Our matrix for mx by j:");
for(count_one = 0; count_one <= all_size-1; count_one +=1)
{
del = count_one % matrix_size;
if (del == 0)
printf("\n");
printf("%2d ", once[count_one]);
}

printf("\n");
printf("%s\n", "Elem of out matrix in columns: ");
for(count_one = 0; count_one <= matrix_size-1; count_one +=1)
{
count_three = count_one;
//if(count_one== 1) break;
while(count_three < all_size)
{
max[count] = count_three;
del = (count % matrix_size);

if (del == 0)
printf("\n");

printf("%d \n", max[count]);
count_three += matrix_size;
count++;
}
}

count_one = 0;
count2 = 0;

count_two = 1;
t = 0;
vrem = 0;

for(count_one = 0; count_one = 2; count_one +=1)
{
while (t != matrix_size)
{
vrem = max[count2];
j += once[vrem];
mas_one[global_count] = j;
printf("%d ", mas_one[count_one]);
count2++;
t++;

}
t = 0;
global_count++;
}
/*
printf("\n");
for(count_one = 0; count_one <= matrix_size; count_one +=1)
{
printf("%d ", mas_one[0]);
}*/
return 0;
}


int main(void)
{
int *once_matrix;
int count_one;
once_matrix = once_matrix_func();
matrix_eqw(once_matrix, once_matrix);
max_func(once_matrix);


scanf("%d");
return sym_null;
}
volvo
CodeGuard говорит, что вылетает твоя программа по банальной причине: ты память выделить-то выделил, а вернуть? Не вернул... Это первое...

Второе: в функции max_func исправь квалификатор с %d на %s - будешь получать нормальную строку, а не тот бред что ты получаешь сейчас:
printf("%s ", "Our matrix for mx by j:"); // #2


Еще одно: там же, есть у тебя строка:
for(count_one = 0; count_one = 2; count_one +=1)

она должна выглядеть так? Пока у тебя вместо условия окончания стоит присваивание... Наверно, все-таки неплохо было бы условие окончания определить?

А вообще непонятно, зачем ты выделяешь память под main_deag? У тебя же этот указатель - локальный, и что это будет? Просто утечка...
Гость
Понял, и исправил, сам не могу теперь понять чего я пытался добиться этим услвоием, но как исправил его все заработало.... Можно вопрос более теретический - как перемножить две матрицы если они представлены в виде одномерных массивов, т.е. чисто нал исте бумаги я это предсатвил и закономерность увидел, но возможно есть известный способов и даже этот теоретический я не сильн понимаю как реализовать. Надеюсь на советы профессионалов... (не готовые программы, хотя если таковые имеются только благодарен, а на советы)
volvo
Ну, если 2 матрицы (заданные в виде двухмерных массивов) перемножаются так:
    for i = 1 to row_1
for j = 1 to col_2
res[i, j] := 0;
for k = 1 to row_2_col_1 do
res[i, j] = res[i, j] + a[i, k] * b[k, j];
, а у тебя матрицы заданы одномерными массивами, то все что тебе надо сделать - найти номер элемента в массиве, соответствующего элементу [i, j] в матрице... Число столбцов матриц ты знаешь, найти нужный элемент не должно быть проблемой...
Neonig
Вот так реализовал, а что-то выдает результаты не те - перепроверил - вроди ве верно...гляньтепожалуйста на функцию умножения
int* matrix_eqw(int* matrix_one, int* matrix_two)
{
int count_one = 0;
int count_two = 0;
int count_three = 0;
int count_four = 0;
int count_five = 0;
int prom_perem = 0;
int vrem = 0;
int from_float_to_int = 0;
float del = 0.0;
int vrem_mas[255];
int rez_mas[256];

// matrix_one[0] = 10;
// matrix_one[4] = 1;
print_mas(matrix_one);
print_mas(matrix_two);

for(count_one = 0; count_one <= all_size; count_one +=1)
{
rez_mas[count_one] = 0;
}
printf("\n");
printf("%s", "First condition of rezult matrix: ");
print_mas(rez_mas);



/*for(count_one = 0; count_one <= matrix_size; count_one +=1)
{
count_three = count_one;
while (count_two != matrix_size)
{
vrem_mas[vrem] = matrix_two[count_three];
count_three += matrix_size;
count_two +=1;
vrem +=1;
}
count_two = 0;
}
printf("\n");
printf("%s", "Our lines of matrix_two: ");
print_mas(vrem_mas);


count_one = 0;
count_three = 0;
vrem = 0;
*/

for(count_one = 0; count_one <= matrix_size; count_one +=1)
for(count_two = 0; count_two <= matrix_size; count_two +=1)
for(count_three = 0; count_two <= matrix_size; count_two +=1)
{
rez_mas[count_one*(matrix_size-1)+count_two] +=
matrix_one[count_one*(matrix_size-1)+count_three] *
matrix_one[count_three*(matrix_size-1)+count_two];
}

print_mas(rez_mas);
return rez_mas;
}
volvo
Уверен в этом коде:
Цитата
for(count_three = 0; count_two <= matrix_size; count_two +=1)
?
Neonig
Не то чтобы уерен, просто у нас на лекции такая вот формула была выписана - я старался ей соответствовать

Цитата



for(i=0;i<Nx-1;i++)
for(k=0;k<Nz-1;k++)
for(j=0;j<Ny-1;j++)
C[i][k]+=A[i][j]*B[j][k];


ошибки исправил, пытаюсь перемножить матрицы

1 1
0 1

и

1 1
0 1

получаю

2 2
1 0
извените за мои скромные познания в алгебре, но разве это правильно?

volvo
Цитата
неверный цикл исправил, но ошибка осталась
Значит, плохо исправил... Вот так нет никакой ошибки:

int *mult_matrix(int *A, int *B) {

int i, j, k, *res;
int *p = (int *)malloc(size * size * sizeof(int));

res = p;
for(i = 0; i < size; ++i)
for(j = 0; j < size; ++j) {
*res = 0;
for(k = 0; k < size; ++k) {
*res += A[i * size + k] * B[k * size + j];
}
res++;
}
return p;
}



Цитата
разве это правильно?
Нет, неправильно... Правильно будет
1 2
0 1
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.