2014-12-06 18 views
0

以下MATLAB代碼段,這產生複數的兩個陣列,如何防止MATLAB放棄數組的「複雜」屬性?

x = complex(1:2,0:1); 
y = complex(zeros(1,2),0); 
whos x y 

打印

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    32 double complex 

如預期。然而,這兩個額外的語句後,

y(1) = x(1); 
whos x y 

以下會打印:

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    16 double 

一個如何防止被丟棄複雜的屬性?

對於記錄,Octave也是如此。

實際上,x是一個函數參數,它的第一個條目恰好具有零虛部,並且y是預分配的返回值。

回答

0

我想我在answer找到了我要找的東西。總而言之,複數數組有兩個數據存儲塊:一個存儲實部,一個存儲虛部。最好的做法應該是將y初始化爲正確大小的雙精度數組,並讓MATLAB根據需要添加第二個內存塊。內存分配的數量最多爲兩個,似乎沒有辦法減少它。

3

如果要確保保留complex數據類型,請明確地將該數字轉換爲complex。因此:

y(1) = complex(x(1)); 

因爲x(1)只有一個真正的分量,MATLAB自動這是爲了節省空間轉換爲real。正如你所看到的,如果複數是純真實的,那麼簡單地存儲真實分量會更有效率,因爲它是8個字節的數字,與complex相比,它是16個字節的數字 - 對於真實分量爲8,對於虛數爲8零件。

同樣在你的代碼中,y在技術上將全部爲real,因爲沒有虛部。如果y至少有一個複雜值,則y仍將保留爲complex。看看下面的代碼:

x = complex(1:2,0:1); 
y = complex(zeros(1,2), [3 5]); 
whos x y 

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    32 double complex 

現在,讓我們嘗試分配和檢查的x類和y

y(1) = x(1); 
whos x y 

Name  Size   Bytes Class  Attributes 

x   1x2    32 double complex 
y   1x2    32 double complex 

此外,作爲一個旁註,你不應該與x有關被轉換爲純真實。只要您將至少一個複數值放入此陣列中,x會自動提升爲complex。試一下,比如:

x = 1:5; 
whos x 

Name  Size   Bytes Class  Attributes 

x   1x5    40 double 

現在使用相同的x陣列,請嘗試:

x(3) = 1 + 4i; 
whos x 

Name  Size   Bytes Class  Attributes 

x   1x5    80 double complex 

編輯

與您的意見,去你能做些什麼,以確保該數組將保持複雜將會在x(1)的虛部添加一個無限小數。一個足夠小的數字,以便數值差異幾乎爲零,但足以尊重y仍然是一個複數值陣列。因此:

x = complex(1:2,0:1); 
y = complex(zeros(1,2),0); 
y(1) = x(1) + i*eps; 
who x y 

Name  Size   Bytes Class  Attributes 

x   1x2    32 double complex 
y   1x2    32 double complex 

eps代表machine epsilon。如果顯示y,顯示出更多顯著的數字,這就是我們看到:

format long 
y 

y = 

    1.000000000000000 + 0.000000000000000i 0.000000000000000 + 0.000000000000000i 

試一下,看看是否適合你。

+0

如果'y'初始時全爲0,則鑄造'x(1)'不起作用。它似乎適用於您的示例,因爲y(2)具有非零虛部。 – 2014-12-06 03:49:57

+0

@FabioSomenzi - 我明白了。但是,你不應該關心'x'被轉換爲純真實的。請參閱我的編輯,瞭解如果從純真實數組開始,然後將複數值賦給其中的任何位置,會發生什麼情況。 – rayryeng 2014-12-06 03:52:12

+0

根據複雜屬性的實現方式,我可能會擔心導入很少的問題,但我希望一次性完成返回值的分配。 – 2014-12-06 03:53:14