2014-02-12 95 views
0

誰能告訴我怎麼向量化如下:如何在Matlab中將矢量化應用於循環?

a = randi([6 10],5);; 
c = unique(a); 
d = [1:5]; % some comparison Values length should be equal to length(c) 

Mat = zeros(size(a)); 
for i = 1:length(c) 
    Mat(a==c(i)) = d(i); 
end 

結果:

 3  1  5  3  3 
    3  5  4  2  3 
    5  1  3  3  3 
    2  2  2  3  3 
    3  5  5  3  4 

這裏6由1代替,7由2代替,等

這是當然的只是一個例子;我真正的Mat更像是2000×2000。

+0

我開始爲你的問題的舊版本制定答案;新版本實際上似乎更簡單:)嗯,我認爲這足以讓你走了。 –

+0

好吧,它的確如此簡單,我剛剛種下了另一個答案。 –

回答

2

注:閱讀我的其他答案第一

要回答這個問題在您的最新編輯:

[~, inds] = histc(a(:), c); 
Mat = reshape(d(inds), size(a)); 

做類似的測試600×100的數據:

a = randi(500,[600 100]); 
c = unique(a); 
d = randi(20, size(c)); 

tic 
Mat = zeros(size(a)); 
for ii = 1:length(c) 
    Mat(a==c(ii)) = d(ii); 
end 
toc 


tic 
[~, inds] = histc(a(:), c); 
Mat2 = reshape(d(inds), size(a)); 
toc 

isequal(Mat,Mat2) 

給出以下內容:

Elapsed time is 0.166673 seconds. %// your method 
Elapsed time is 0.006669 seconds. %// my method 
ans =        %// yes they're equal 
    1 

速度再次相差約250倍。

+0

+1很棒!我不知道'histc'的第二個輸出,它似乎是有用的。 – Adiel

0

備註:這是原始問題的答案;第二次編輯完全改變了這個問題,所以下面的答案不再適用。編輯大大簡化了問題,所以這個答案仍然是一個很好的開始。

基本上,a的所有唯一值將被替換爲b中的相應值。這意味着要分析的矩陣是b,唯一的困難在於,條件b < d必須適用於對應的指數b

要做到這一點,您可以將a中的所有元素簡單歸爲c定義的組,並確定b中的每個元素屬於哪個組。該信息可用於在d中查找適當的索引。

換句話說:

NewMat = b; 
[~, inds] = histc(a(:), c); 
NewMat(NewMat(:) > d(inds)) = 0; 

小試比較性能和驗證兩種方法的等式:

a = randi(1000, 74,100); 
b = randi(1000, 74,100); 

c = unique(a); 
d = randi(1000, size(c)); % some comparison Values 

%// Your method 
tic 
NewMat = zeros(size(a)); 
for i = 1:length(c) 
    Mat = zeros(size(a)); 
    Mat(a==c(i)) = b(a==c(i)); 
    Mat(Mat > d(i)) =0; 
    NewMat = NewMat + Mat; 
end 
NewMat1 = NewMat; 
toc 

%// My method 
tic 
[~,inds] = histc(a(:), c); 
b(b(:) > d(inds)) = 0; 
NewMat2 = b; 
toc 

%// validate solution 
isequal(NewMat1, NewMat2) 

結果:

%// 74 × 100 
Elapsed time is 0.151808 seconds. %// your method 
Elapsed time is 0.001007 seconds. %// my method 
ans =        %// yes, they're equal 
    1 

因此,一個因素〜150的性能提升。使用不是74×100而是740×1000給出

%// 740 × 1000 
Elapsed time is 27.587543 seconds. %// your method 
Elapsed time is 0.111467 seconds. %// my method 
ans =        %// yes, they're equal 
    1 

或約250倍的差異因子。顯然,你的方法比histc的方法縮小了。

+0

非常感謝................ – user2851655

+0

@ user2851655:另請參閱我的其他答案,它回答您的問題,因爲它現在是。 –

+0

@ user2851655:不客氣,我喜歡這些謎題,所以這真是我的榮幸:) –