本文目錄一覽:
- 1、矩陣的冪怎麼算?
- 2、如何用c語言中的函數遞歸調用演算法實現n階矩陣的n次冪的求解?
- 3、c語言,快速冪代碼是什麼,怎麼用?
- 4、用C/C++如何實現矩陣的冪運算,求高手作答~
- 5、用C語言編寫程序求矩陣的n次方
- 6、C語言有關快速冪的問題
矩陣的冪怎麼算?
有下面三種情況:
1、如果你所要求的是一般矩陣的高次冪的話,是沒有捷徑可走的,只能夠一個個去乘出來。
至於低次冪,如果能夠相似對角化,即:存在簡便演算法的話,在二階矩陣的情況下簡便演算法未必有直接乘來得快,所以推薦直接乘。
2、如果你要求的是能夠相似對角化的矩陣的高次冪的話,是存在簡便演算法的。
設要求矩陣A的n次冪,且A=Q^(-1)*Λ*Q,其中Q為可逆陣,Λ為對角陣。
即:A可以相似對角化。那麼此時,有求冪公式:A^n=Q^(-1)*(Λ)^n*Q,而對角陣求n次方,只需要每個對角元素變為n次方即可,這樣就可以快速求出二階矩陣A的的高次冪。
3、如果矩陣可以相似對角化,求相似對角化的矩陣Q的具體步驟為:
求|λE-A|=0 (其中E為單位陣)的解,得λ1和λ2(不管是否重根),這就是Λ矩陣的對角元素。
依次把λ1和λ2帶入方程(如果λ是重根只需代一次,就可求得兩個基礎解)[λE-A][x]=[0],求得兩個解向量[x1]、[x2],從而矩陣Q的形式就是[x1 x2]。
接下來的求逆運算是一種基礎運算,這裡不再贅述。
下面可以舉一個例子:
二階方陣:
1 a
0 1
求它的n次方矩陣
方陣A的k次冪定義為 k 個A連乘: A^k = AA…A (k個)
一些常用的性質有:
1. (A^m)^n = A^mn
2. A^mA^n = A^(m+n)
一般計算的方法有:
1. 計算A^2,A^3 找規律, 然後用歸納法證明
2. 若r(A)=1, 則A=αβ^T, A^n=(β^Tα)^(n-1)A
注: β^Tα =α^Tβ = tr(αβ^T)
3. 分拆法: A=B+C, BC=CB, 用二項式公式展開
適用於 B^n 易計算, C的低次冪為零矩陣: C^2 或 C^3 = 0.
4. 用對角化 A=P^-1diagP
A^n = P^-1diag^nP
擴展資料:
冪等矩陣的主要性質:
1.冪等矩陣的特徵值只可能是0,1;
2.冪等矩陣可對角化;
3.冪等矩陣的跡等於冪等矩陣的秩,即tr(A)=rank(A);
4.可逆的冪等矩陣為E;
5.方陣零矩陣和單位矩陣都是冪等矩陣;
6.冪等矩陣A滿足:A(E-A)=(E-A)A=0;
7.冪等矩陣A:Ax=x的充要條件是x∈R(A);
8.A的核N(A)等於(E-A)的列空間R(E-A),且N(E-A)=R(A)。考慮冪等矩陣運算後仍為冪等矩陣的要求,可以給出冪等矩陣的運算:
1)設 A1,A2都是冪等矩陣,則(A1+A2) 為冪等矩陣的充分必要條件為:A1·A2 =A2·A1=0,且有:R(A1+A2) =R (A1) ⊕R (A2);N(A1+A2) =N(A1)∩N(A2);
2)設 A1, A2都是冪等矩陣,則(A1-A2) 為冪等矩陣的充分必要條件為:A1·A2=A2·A1=A2,且有:R(A1-A2) =R(A1)∩N (A2);N (A1- A2) =N (A1)⊕R (A2);
3)設 A1,A2都是冪等矩陣,若A1·A2=A2·A1,則A1·A2為冪等矩陣,且有:R (A1·A2) =R(A1) ∩R (A2);N (A1·A2) =N (A1) +N (A2)。
如何用c語言中的函數遞歸調用演算法實現n階矩陣的n次冪的求解?
/*用c語言中的函數遞歸調用演算法實現n階矩陣的n次冪*/
#include stdio.h
#include stdlib.h
#include time.h
#include string.h
//創建矩陣,矩陣用一維數組存儲
double *matCreate(unsigned int m, unsigned int n)
{
double *p = (double *)malloc(sizeof(double) * m * n);
if (p == NULL) printf(“創建矩陣失敗!\n”);
return p;
}
//輸入矩陣元素
void matInput(double *a, unsigned int m, unsigned int n)
{
for (int i = 0; i m; ++i)
{
for (int j = 0; j n; ++j)
{
scanf(“%f “, a[i * n + j]);
}
}
return;
}
//隨機產生矩陣元素,均勻分布於[from to]
void matInitRand(double *a, unsigned int m, unsigned int n, double from, double to)
{
if (a == NULL || m = 0 || n = 0) return;
double x;
srand(time(NULL));
for (int i = 0; i m; ++i)
{
for (int j = 0; j n; ++j)
{
x = (1.0 * rand() / RAND_MAX) * (to – from) + from;
a[i * n + j] = x;
}
}
return;
}
//轉置
void matTranspose(double *a, double *b, unsigned int m, unsigned int n)
{
for (int i = 0; i m; ++i)
{
for (int j = 0; j n; ++j)
{
b[j*n +i]=a[i * n + j] ;
}
}
}
//輸出矩陣
void matPrint(double *a, unsigned int m, unsigned int n)
{
for (int i = 0; i m; ++i)
{
for (int j = 0; j n; ++j)
{
printf(“%8.4f “, a[i * n + j]);
}
putchar(‘\n’);
}
return;
}
//矩陣乘法c=a*b
void matMul(double *a, double *b, double *c, unsigned int m, unsigned int n, unsigned int k)
{
if (a == NULL || b == NULL || c == NULL || m = 0 || n = 0 || k = 0) return;
double x = 0.0f;
for (int i = 0; i m; ++i)
{
for (int u = 0; u k; ++u)
{
x = 0.0f;
for (int j = 0; j n; ++j)
{
x += a[i * n + j] * b[j * k + u];
}
c[i * k + u] = x;
}
}
return;
}
//b=a^n, a:m*m階矩陣
void matFac(double *a, double *b, unsigned int n, unsigned int m)
{
double *c = (double *)malloc(sizeof(double) * m * m); //保存臨時結果
if (n 1)
{
matFac(a, c, n – 1, m);
matMul(a, c, b, m, m, m);
}
else
memcpy(b, a, sizeof(double)*m * m);
// printf(“%d:\n”,n);
// matPrint(b, m,m);
free(c); //回收內存
return ;
}
#define M 3
#define N 4
#define K N
int main(int argc, char const *argv[])
{
double *A, *B, *B1,*BT, *C;
A = matCreate(M, N);
B = matCreate(N, K);
B1 = matCreate(N, K);
BT = matCreate(K,N);
C = matCreate(M, K);
if (!A || !B || !B1 || !BT || !C) return -1;
matInitRand(A, M, N, 0.0f, 1.0f);
printf(“A=\n”);
matPrint(A, M, N);
matInitRand(B, N, K, 0.0f, 1.0f);
printf(“B=\n”);
matPrint(B, N, K);
matTranspose(B,BT,N,K);
printf(“B’=\n”);
matPrint(BT, K,N);
matMul(A, B, C, M, N, K);
printf(“C=A*B\n”);
matPrint(C, M, N);
matFac(B, B1, 4, N);
printf(“B^4\n”);
matPrint(B1, N, K);
return 0;
}
c語言,快速冪代碼是什麼,怎麼用?
所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求一個冪式的模(余)。在程序設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪取模演算法。
用遞歸
x^y可如下實現
unsigned long pow(int x, unsigned y)
{
unsigned long tmp;
if(!y) return 1;
tmp = pow(x, y / 2);
if(y % 2 == 0) return (tmp * tmp);
else return (tmp * tmp * x);
}
用C/C++如何實現矩陣的冪運算,求高手作答~
#includestdio.h
#includestring.h
#includestdlib.h
#includetime.h
int ** alloc2d(int m) {
int **array,i;
array=(int **)malloc(m*sizeof(int *));
if(array==NULL) return NULL;
for(i=0;im;i++) {
array[i]=(int *)malloc(m*sizeof(int));
if(array[i]==NULL) {for(;i=0;i–) {free(array[i]);} free(array);return NULL;}
}
return array;
}
void autoinput(int **a,int m) {
int i,j;
srand(time(0));
for(i=0;im;i++)
for(j=0;jm;j++)
*(*(a+i)+j)=rand()%3;
}
void out(int **a,int m) {
int i,j;
for(i=0;im;i++) {
for(j=0;jm;j++)
printf(“%4d”,*(*(a+i)+j));
printf(“\n”);
}
}
int **mltply(int **a,int **b,int **c,int m) {
int i,j,k;
for(i=0;im;i++)
for(j=0;jm;j++)
for(*(*(c+i)+j)=0,k=0;km;k++)
*(*(c+i)+j)+=*(*(a+i)+k)*(*(*(b+k)+j));
return c;
}
int main() {
int i,m,times,j,n=0;
int **ops[3];
printf(“input乘法方陣規模m*m幾次冪:\n”);
scanf(“%d%d”,m,times);
for(i=0;i3;i++) {
ops[i]=alloc2d(m);
if(i=0) {autoinput(ops[i],m);printf(“矩陣%d\n”,i+1);out(ops[i],m);printf(“\n”);}
}
for(int h=1;h=2;h++)
for(i=0;im;i++)
for(j=0;jm;j++)
*(*(ops[h]+i)+j)=0;
printf(“\n乘法\n”);
mltply(ops[0],ops[0],ops[1],m);
times-=2;
while(times) {
if(n++%2==0) mltply(ops[1],ops[0],ops[2],m);
else mltply(ops[2],ops[0],ops[1],m);
–times;
}
if(n%2==0) out(ops[1],m);
else out(ops[2],m);
return 0;
}
//矩陣輸入用的隨機
//可能麻煩了點 要不你優化一下
用C語言編寫程序求矩陣的n次方
這要看具體情況 一般有以下幾種方法 1. 計算A^2,A^3 找規律, 然後用歸納法證明 2. 若r(A)=1, 則A=αβ^T, A^n=(β^Tα)^(n-1)A 注: β^Tα =α^Tβ = tr(αβ^T) 3. 分拆法: A=B+C, BC=CB, 用二項式公式展開 適用於 B^n 易計算, C的低次冪為零: C^2 或 C^3.
C語言有關快速冪的問題
type
arrty=array[1..10000] of longint;
var
n,mn,len,lenm,i,mnl:longint;
a,m:arrty;
procedure mxm;
var
c:arrty;
i,j:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to lenm do
for j:=1 to lenm do
begin
inc(c[i+j-1],m[i]*m[j]);
inc(c[i+j],c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
lenm:=lenm+lenm+1;
while (lenm1) and (c[lenm]=0) do
dec(lenm);
for i:=1 to lenm do
m[i]:=c[i];
end;
procedure axm;
var
c:arrty;
i,j:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to len do
for j:=1 to lenm do
begin
inc(c[i+j-1],a[i]*m[j]);
inc(c[i+j],c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
len:=len+lenm+1;
while (len1) and (c[len]=0) do
dec(len);
for i:=1 to len do
a[i]:=c[i];
end;
begin
fillchar(a,sizeof(a),0);
readln(mn,n);
mnl:=mn;
len:=0;
while mnl0 do
begin
inc(lenm);
m[lenm]:=mnl mod 10;
mnl:=mnl div 10;
end;
a[1]:=1;
len:=1;
while n0 do
begin
if n mod 2=1 then
axm;
n:=n div 2;
mxm;
end;
for i:=len downto 1 do
write(a[i]);
writeln;
end.
原創文章,作者:PTGX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147642.html