2012-12-13 13 views
7

Sadece hayali sayıları içeren bir diziden yalnızca gerçek sayıları almak istiyorum Dizideki hayali sayıları kaldırmak istiyorum. Bu nedenle, gerçek sayı elemanı olması gereken, sadece 5 elementten oluşan bir dizi elde etmek için 5 gerçek ve 5 hayali olan 10 elemandan oluşan bir diziden. Bu MATLABmatlab dizisindeki gerçek sayıyı ayıkla

düzenlemede:

istenen çıkış input_array tek gerçek elemanları ihtiva

output = [ 1, 3, -4 ]; 

olur bir örnek

input_array = [ 1, 1+i, -2+2*j, 3, -4, j ]; 

ekleme.

cevap

11

Başka, daha vectorized yol:

sel = a == real(a); % choose only real elements 

only_reals = a(sel); 
+0

çok teşekkürler, 150 yıla kadar sağlığın tadını çıkarabilirsiniz !!! – carminePat

3

Bunu isreal işleviyle yapabilirsiniz. Dönen isreal, bir vektör çıktısı vermez, bu genellikle MATLAB için gariptir, çünkü genellikle yapar. Yani, bir for döngüsü kullanmanız gerekir.

arr = [1+i 5 6-3i 8]; 
arrReal = []; 
for idx = 1:numel(arr) 
    if isreal(arr(idx)) 
     arrReal(end+1) = arr(idx); 
    end 
end 

Bir loopless çözümü ile gelecek burada büyük millet varsayalım.

Shai en düzenleme

: çıktı sonucu Tabii

arrReal = NaN(size(arr)); % pre-allocation 
for idx = 1:numel(arr) 
    if isreal(arr(idx)) 
     arrReal(idx) = arr(idx); 
    end 
end 
arrReal(isnan(arrReal)) = []; % discard non-relevant entries 

öncesi tahsisi ile

bir versiyonu, bu hedefe gevreksiz elde edilebilir (diğer cevaplar bakın). Ancak bu döngüsel sürüm için, önceden ayırma önemli bir bileşen.

+0

ilginç bir kullanım. Ancak cevabınızın iki büyük dezavantajı vardır: 1. bir döngü kullanır (daha önce de belirttiğiniz gibi). 2. "arrReal" çıkışı döngü içinde büyür. Bu tür bellek kullanımı Matlab'ın ** gerçekten ** yavaşlamasına neden olur. Daha iyi bir yol, 'arrReal' 'arr' boyutuna önceden ayırmak ve döngüden sonra yedek parçayı kaldırmaktır. Her neyse, cevabınız için teşekkürler! – Shai

+0

@Shai Önceden tahminde bulunmayı düşündüm ancak başka bir dizin değişkeni tutmaktan başka bir ifadeyle 'arrReal' indekslemenin bir yolunu bulamadım. Yani, yapmaya karar verdim. Ama yine de sahip olmalıyım. Daha zekice bir yol biliyor musun? – HebeleHododo

+0

Cevabınızı yeni düzenledim ve ön ayırma ile bir sürüm ekledim. Umarım beğenirsin. – Shai

5

ile birlikte arrayfun numaralarını kullanarak gerçek sayıların gerçek olup olmadığını kontrol edin ve/veya real sadece gerçek parçaları saklayın. Örnekler:

a = [1+i 2 3 -1-i]; 
realidx = arrayfun(@isreal,a); 
only_reals = a(realidx); 
only_real_part = real(a); 

>> only_reals 

    = [ 2 3] 

>> only_real_part 

    = [1 2 3 -1] 
+0

+1 Her zaman arrayfun'u unuturum. – HebeleHododo

+0

temelde aynı zamanda bir döngüdür, ancak tek gömlekler için güzeldir –

+1

@GuntherStruyf Gelecekte ümit etmeliyiz ki tüm * eğlence fonksiyonları etkili bir şekilde uygulanacaktır (paralel veya bir şey ...) – Shai

4

Reel sayılar sıfır hayali parçası olacağım, bu yüzden: isreal` `arasında

input_array(imag(input_array)==0); 

ans = 
    1  3 -4