備註:這是原始問題的答案;第二次編輯完全改變了這個問題,所以下面的答案不再適用。編輯大大簡化了問題,所以這個答案仍然是一個很好的開始。
基本上,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
的方法縮小了。
我開始爲你的問題的舊版本制定答案;新版本實際上似乎更簡單:)嗯,我認爲這足以讓你走了。 –
好吧,它的確如此簡單,我剛剛種下了另一個答案。 –