2016-03-08 102 views
0

我想在VHDL中處理LU分解。我是VHDL的入門者。於是我開始在MATLAB中實現LU分解算法。LU分解在VHDL

a = [1 2 2;3 4 4;5 6 6]; 
    x=a; 
    n=size(x,1); 
    l=zeros(n,n); 
    u=zeros(n,n); 

    for k=1:n 
     if (a(k,k)~=0) 
      u(k,k)=x(k,k); 
      l(k,k)=1; 
     for i=k+1:n 
      l(i,k)=x(i,k)/x(k,k); 
      u(k,i)=x(k,i); 
     end 

     for i=k+1:n 
      for j=k+1:n 
       x(i,j)=x(i,j)-(l(i,k)*u(k,j)); 
      end 
     end 

     else break 
     end 

    end 

然後我開始做這個沒有for循環,因爲for循環在vhdl中不像matlab那樣工作。現在,我正面臨爲級聯for循環找到等效代碼的問題。

a = [1 2 2;3 4 4;5 6 6]; 
x=a; 
n=size(x,1); 
l=zeros(n,n); 
u=zeros(n,n); 
k=1; 
m=2; 
j=2; 
p=2; 
for clock=1:100 
if k>=1 && k<=n 
    if (a(k,k)~=0) 
     u(k,k)=x(k,k); 
     l(k,k)=1; 
    else disp('Decomposition not possible') 
     return 
    end 
    if (m>=k+1 && m<=n) 
     l(m,k)=x(m,k)/x(k,k); 
     u(k,m)=x(k,m); 
     m=m+1; 
    end 

    if p>=k+1 && p<=n 
     if j>=k+1 && j<=n 
      x(p,j)=x(p,j)-(l(p,k)*u(k,j)); 
      j=j+1; 
     end 
     if j==n+1 
      p=p+1; 
      j=2; 
     end 
    end  
end 
    k=k+1; 
end 

我知道最後一個代碼不等於上一個代碼。有人可以幫助我在VHDL中做這個提示嗎?

+0

搜索「matlab lu」? – patrik

回答

2

船長明顯的(職稱)的救助:

A = [1 2 2;3 4 4;5 6 6]; 
[L,U] = lu(A); 

對於實際問題:「一個可以實現循環使用if/else,而不是for/while」(不能很好地反映在標題雖然):是的,如果語言允許goto陳述是可能的。循環基本上(不)條件跳轉在聲明「流」。 MATLAB不是這些語言之一。

在可以實現(聲明除外)基本for圈像這樣的類C語言:

 k = 0; 

enter_loop: 
     if(k < n) { 
       /* here do in-loop stuff */ 
       k = k+1; 
       goto enter_loop; 
     } 

注:您的問題似乎是用VHDL。你爲什麼不改變問題標籤,以便VHDL人可以直接回答它?

+0

'while true'循環和'if - break'離開條件怎麼辦?是的,我會標記這樣的代碼:*你在開玩笑嗎?* – Crowley

+0

@Crowley我認爲這一點是避免語言支持的循環語句。但這絕對是*你在開玩笑嗎?*除非代碼是由Don Knuth編寫的:https://www.cs.sjsu.edu/~mak/CS185C/KnuthStructuredProgrammingGoTo.pdf :-) – 2016-03-08 14:36:34

+0

我同意**正確**用黑客編寫和優化代碼遠勝於編寫「正確」的醜陋代碼。 – Crowley