2013-04-18 24 views
6

Matlab'da hızlı bir uygulama aramak için basit bir sorunum var. Ben değer dizisi var diyelim:İşlenenler || ve && operatörleri mantıksal skaler değerlere dönüştürülebilir olmalıdır.

a = floor(rand(5,5).*255) 

Sonra benzer büyüklükteki eşik dizisi olan en çok diyelim: a içinde değerleri için

a_thresh = floor(rand(5,5).*255) 

onlar tekabül daha 0.5x daha küçükse

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 
0: yani, benzer 1.2x için a_thresh değeri de sıfıra ayarlanmalıdır - a_thresh değeri I çıkışı 0 olmak istiyorum

0,4x ve 0,5x ile 1,0x ve 1,2x arasındaki değerler için orantılı bir miktar istiyorum ve 0,5 ile 1,0 arasında değişmeden a değerini değiştirmek istiyorum.

operandların || etmek: Ben diyor bir hata alıyorum, ancak

a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a; 

: Ben aşağıdaki gibi bir şey olur diye düşündüm ve & & işlemleri mantıksal sayısal alan dönüştürülebilen

bu çözmek için nasıl herhangi bir tavsiye değerleri olmalıdır? Açıkçası, bunu yapmak için döngüler kullanabilirdim ve önemsiz olurdu, ancak kodun vectorized olmasını istiyorum.

cevap

14

şey hakkında &&& yanı diziler üzerinde çalışabilir oysa o, skalerler sadece çalışabilir olmasıdır. Çalıştırmak için &&'u & olarak değiştirmeniz gerekir (bu konuda daha fazla bilgiyi this question numaralı telefondan okuyabilirsiniz). Bir yoruma açıklanan ikinci sorun ile ilgili olarak
:

Güncelleme (sadece belirli öğeleri seçerek) endekslerini kullandığınız için soldaki elemanların sayısı farklıdır ve sağda çalışmakta olduğunuz tüm matris a ve a_thresh.

Her iki tarafta da endekslerini kullanmak gerekir, bu yüzden bir değişkende saklayarak öneririz ve daha sonra bir dizi simge olarak kullanmak, bu satırlar boyunca:

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5); 
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx); 

emin değilim eğer hesaplama kendisi Doğru, bu yüzden kontrol etmek için size bırakacağım.

+0

Fantastik - &/&& sorunu giderir - Bazıları bunu nasıl bilemedim, teşekkürler! Şimdi küçük bir sorun var, sağdaki elemanların sayısı soldan farklı. Bunu düzeltmenin akıllı bir yolu var mı? – trican

+0

@trican Çalıştım, lütfen güncellemeye bakın. –

+1

Çok, çok teşekkürler Eitan - çözümünüz mükemmel çalışıyor - ve açıkça Matlab işimde başka bir yerde nasıl kullanabileceğimi görebileceğim kadar genel – trican

İlgili konular