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

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