mnożenie macierzy pasmowej przez wektor

0

Cześć
Mam do wykonania takie zadanie

I wiem, że żeby pomnożyć macierz przez wektor liczba kolumn macierzy musi być równa wierszy wektora, ale w takim wypadku skoro ja zapisuje inaczej moją macierz, to liczba kolumn ma się zgadzać z tej mojej pierwszej macierzy czy liczba kolumn to będzie ta zredukowana czyli długość pasma

screenshot-20220512175937.png

2

Liczba kolumn nadal 12, ponieważ liczba wierszy w skróconym zapisie jest 12 (bo macierz pasmowa musi być kwadratową).
Jedynie kolumny tak jakby przesunięte o (7-1)/2+y

0

Czyli jak mam taką macierz pasmowa i wektor to wynik mam taki,

screenshot-20220512203920.png

a po redukcji moja macierz ma postać

screenshot-20220512204125.png

zatem jak wykonać takie mnożenie skoro liczba kolumn teraz nie zgadza się z liczbą wierszy wektora

1
int ii=i+(3-1)/2+y;
if(0<=ii && ii<5) AmulB[y][x]+=a[y][ii]*b[i][x];
1

Ale jakie jest pytanie? W czym problem?

0
_13th_Dragon napisał(a):
int ii=i+(3-1)/2+y;

caly kod juz napisałem, wraz z redukcja macierzy, i zostalo mi tylko wykonanie mnozenia, ale nie do konca rozumiem tutaj twój kod,

i to prawdopodobnie ilosc wierszy mojej macierzy
(3-1)/2, to pół pasma z wyłączeniem przekątnej
a "y" to co to jest?

if(0<=ii && ii<5) AmulB[y][x]+=a[y][ii]*b[i][x];

i tej częsci tez nie rozumiem

0
The BanQ napisał(a):

a "y" to co to jest?

AmulB[y][x] ... <= czy z tego nie wynika?

0
_13th_Dragon napisał(a):
The BanQ napisał(a):

a "y" to co to jest?

AmulB[y][x] ... <= czy z tego nie wynika?

ja trochę inaczej ułożyłem sobie to w głowie, żeby nie tworzyć tablicy dwuwymiarowej. Z tego mnożenia miałabym jedną kolumnę, wiec tworze sobie tablice jednowymiarową, w wyniki wypisuje z użyciem '\n'.

ale rozumiem ze y to 1, w takim razie

0
The BanQ napisał(a):

caly kod juz napisałem, wraz z redukcja macierzy, i zostalo mi tylko wykonanie mnozenia, ale nie do konca rozumiem tutaj twój kod,

Jak masz kod to go pokaż i wyjaśnij czemu masz problem z mnożeniem.

W C++ https://godbolt.org/z/K4q1r9Ks4 (disclaimer: pewnie pomiszałem k1 i k2)

0
MarekR22 napisał(a):
The BanQ napisał(a):

caly kod juz napisałem, wraz z redukcja macierzy, i zostalo mi tylko wykonanie mnozenia, ale nie do konca rozumiem tutaj twój kod,

Jak masz kod to go pokaż i wyjaśnij czemu masz problem z mnożeniem.

W C++ https://godbolt.org/z/K4q1r9Ks4 (disclaimer: pewnie pomiszałem k1 i k2)

void mnozenieMacierzy(double **macierz, double *wektor, int w_macierzy,int k_macierzy, int pasmo)
{
	//macierz to moja macierz
	// wektor to moj wektor
	// w_macierzy to ilosc wierszy macierzy
	// k_macierzy to ilosc kolumn mojej macierzy
	// pasmo to dlugosc pasma mojej macierzy

	double* wynik = (double*)malloc(sizeof(double) * w_macierzy);
	if (!wynik)
	{
		bledy();
		exit(10);
	}
	int i,j;

	for (i = 0; i < w_macierzy; i++)
		wynik[i] = 0;

	for (i = 0; i < w_macierzy; i++)
	{
		for (j = 0; j < k_macierzy; j++)
		{
			int ii = i + ((pasmo - 1) / 2 + 1);
			if (0 <= ii && ii < w_macierzy)
			{
				wynik[i] += macierz[i][j] * wektor[ii];
			}
		}
	}
	
	for (i = 0; i < w_macierzy; i++)
	{
		printf("%lf\n", wynik[i]);
	}


	if (macierz)
	{
		for (i = 0; i < w_macierzy; i++)
		{
			if (macierz[i])
			{
				free(macierz[i]);
			}
		}
		free(macierz);
		macierz = NULL;
	}

	if (wynik)
		free(wynik);
	wynik = NULL;

	if (wektor)
		free(wektor);
	wektor = NULL;
}

to funkcja do mnozenia mojej macierzy(zredukowanej) przez wektor, próbowałem zaimplementować to co mi napisałeś, ale nie wychodzi

0

moja macierz którą wpisuje do pliku ma postać

3 5 4 2 3 5 3 0 0 0 0 0 0 0 0 0 0
8 3 4 4 3 2 4 4 0 0 0 0 0 0 0 0 0
6 7 6 5 3 5 5 3 5 0 0 0 0 0 0 0 0
1 2 6 5 6 3 4 5 4 6 0 0 0 0 0 0 0
3 4 5 9 6 7 5 4 5 6 7 0 0 0 0 0 0
9 5 8 5 7 9 5 0 7 6 5 3 0 0 0 0 0
2 8 5 5 6 4 7 0 7 6 5 4 3 0 0 0 0
0 3 5 5 3 4 6 7 8 4 7 4 3 4 0 0 0
0 0 6 4 3 2 2 3 2 4 6 0 2 2 5 0 0
0 0 0 6 5 6 0 2 7 6 5 6 4 6 4 5 0
0 0 0 0 5 4 4 4 7 6 5 3 2 6 6 6 4
0 0 0 0 0 3 3 4 7 6 5 6 7 6 3 5 7
0 0 0 0 0 0 4 5 7 6 5 6 7 6 3 5 7
0 0 0 0 0 0 0 5 7 6 5 0 7 6 5 6 3
0 0 0 0 0 0 0 0 4 6 5 7 9 5 9 7 6
0 0 0 0 0 0 0 0 0 5 5 7 6 5 9 6 3
0 0 0 0 0 0 0 0 0 0 5 7 6 5 9 6 5

po redukcji jak proszą mnie w poleceniu to ma postać(taką przechowuje w mojej tablicy)

0.0 0.0 0.0 0.0 0.0 0.0 3.0 5.0 4.0 2.0 3.0 5.0 3.0
0.0 0.0 0.0 0.0 0.0 8.0 3.0 4.0 4.0 3.0 2.0 4.0 4.0
0.0 0.0 0.0 0.0 6.0 7.0 6.0 5.0 3.0 5.0 5.0 3.0 5.0
0.0 0.0 0.0 1.0 2.0 6.0 5.0 6.0 3.0 4.0 5.0 4.0 6.0
0.0 0.0 3.0 4.0 5.0 9.0 6.0 7.0 5.0 4.0 5.0 6.0 7.0
0.0 9.0 5.0 8.0 5.0 7.0 9.0 5.0 0.0 7.0 6.0 5.0 3.0
2.0 8.0 5.0 5.0 6.0 4.0 7.0 0.0 7.0 6.0 5.0 4.0 3.0
3.0 5.0 5.0 3.0 4.0 6.0 7.0 8.0 4.0 7.0 4.0 3.0 4.0
6.0 4.0 3.0 2.0 2.0 3.0 2.0 4.0 6.0 0.0 2.0 2.0 5.0
6.0 5.0 6.0 0.0 2.0 7.0 6.0 5.0 6.0 4.0 6.0 4.0 5.0
5.0 4.0 4.0 4.0 7.0 6.0 5.0 3.0 2.0 6.0 6.0 6.0 4.0
3.0 3.0 4.0 7.0 6.0 5.0 6.0 7.0 6.0 3.0 5.0 7.0 0.0
4.0 5.0 7.0 6.0 5.0 6.0 7.0 6.0 3.0 5.0 7.0 0.0 0.0
5.0 7.0 6.0 5.0 0.0 7.0 6.0 5.0 6.0 3.0 0.0 0.0 0.0
4.0 6.0 5.0 7.0 9.0 5.0 9.0 7.0 6.0 0.0 0.0 0.0 0.0
5.0 5.0 7.0 6.0 5.0 9.0 6.0 3.0 0.0 0.0 0.0 0.0 0.0
5.0 7.0 6.0 5.0 9.0 6.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0

i dla tak zredukowanej macierzy właśnie musze wykonać mnożenie, ale przez to że ilość kolumn nie jest teraz równa ilości wierszy wektora mam problem

1

Może lepiej jak zaczniesz od czegoś takiego:

struct BandMatrix {
    size_t n;
    size_t k1;
    size_t k2;

    double *data;
};

typedef struct BandMatrix* BandMatrixRef;

BandMatrixRef BandMatrixAlloc(size_t n, size_t k1, size_t k2);
void BandMatrixFree(BandMatrixRef m);
int BandMatrixGet(BandMatrixRef m, size_t i, size_t j, double* value);
void BandMatrixMul(BandMatrixRef m, const double* v, double* result);
void BandMatrixPrint(BandMatrixRef m, FILE* f);
void BandMatrixScan(BandMatrixRef m, FILE* f);

https://godbolt.org/z/hbGdqbqKe

1 użytkowników online, w tym zalogowanych: 0, gości: 1