(处女作)因为初次写一个创新一点的编程,看网上也没有关于这个的算法,所以我就发表一个了。大学狗写作业轻松又方便哈! (以下是matlab算法,我觉得这个算法的结果我觉得还是比较有美感的,但是中间有点效率不行,但我没时间改进,希望大家能指点一下。这是我的期末作业。虽然我也觉得这算法没多大用,但我还是先公开发布一波吧。数学证明不难,我也就不发布了。大家要的话可以私信我) 举个例子:
>> A=[0 1 0 0 0 0 0;0 0 1 0 0 0 0;0 0 0 1 0 0 0 ;0 0 0 0 1 0 0;0 0 0 0 0 1 0;0 0 0 0 0 0 1;0 0 0 0 0 0 0]; >> commat(A) 时间已过 18.127244 秒。 ans = [ x7_7, x6_7, x5_7, x4_7, x3_7, x2_7, x1_7] [ 0, x7_7, x6_7, x5_7, x4_7, x3_7, x2_7] [ 0, 0, x7_7, x6_7, x5_7, x4_7, x3_7] [ 0, 0, 0, x7_7, x6_7, x5_7, x4_7] [ 0, 0, 0, 0, x7_7, x6_7, x5_7] [ 0, 0, 0, 0, 0, x7_7, x6_7] [ 0, 0, 0, 0, 0, 0, x7_7] function [ result ] = commat( A ) tic g=1; [n,n]=size(A); X=sym('x',[n,n]) ; b=A*X-X*A; B= zeros(n^2,n^2); [r,c] = size(b); for i = 1:r for j = 1:c b(i,j); for p=1:n for q=1:n B(g,(p-1)*n+q)=diff(b(i,j),X(p,q)); end end g=g+1; end end B=rref(B); r=rank(B); C=zeros(n^2,2); s=1;t=1;f=1; for i=f:n^2 f=f+1; for j=1:n^2 if B(i,j)==1 B(i,j)=0; C(s,t)=i;C(s,t+1)=j; s=s+1; break else f=f+1; end end end X1=reshape(X',1,n^2); K=(-1).*B*X1'; g=1;d=0; for i=1:r if C(i,1)<C(i,2)&&C(i,1)~=C(i,2)-d; d=d+1; end if mod(i+d,n)==0 k=n; X(g,k)=K(i,1); else k=mod(i+d,n); g=ceil((i+d)/n); X(g,k)=K(i,1); end end toc result=X; end予人点赞,手有余香哦。