第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

數(shù)組元素的重復(fù)拷貝:matlab中的游程解碼

數(shù)組元素的重復(fù)拷貝:matlab中的游程解碼

慕容3067478 2019-07-02 11:21:53
數(shù)組元素的重復(fù)拷貝:matlab中的游程解碼我試圖使用“值”數(shù)組和“計(jì)數(shù)器”數(shù)組向數(shù)組中插入多個(gè)值。例如,如果:a=[1,3,2,5]b=[2,2,1,3]我要一些函數(shù)的輸出c=somefunction(a,b)成為c=[1,1,3,3,2,5,5,5]a(1)遞歸b(1)次,a(2)遞歸b(2)次等.在MATLAB中有一個(gè)內(nèi)置函數(shù)來(lái)實(shí)現(xiàn)這個(gè)功能嗎?如果可能的話,我想避免使用for循環(huán)。我嘗試過(guò)“repmat()”和“kron()”的變體,但都沒(méi)有用。這基本上是Run-length encoding.
查看完整描述

3 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

問(wèn)題陳述

我們有一系列的價(jià)值觀,vals以及奔跑的長(zhǎng)度,runlens:

vals     = [1,3,2,5]runlens  = [2,2,1,3]

中的每個(gè)元素都需要重復(fù)。vals中的每個(gè)對(duì)應(yīng)元素的時(shí)間。runlens..因此,最后的產(chǎn)出將是:

output = [1,1,3,3,2,5,5,5]

前瞻性方法

使用matlab最快的工具之一是cumsum在處理不規(guī)則模式的矢量化問(wèn)題時(shí)非常有用。在所述問(wèn)題中,不規(guī)則性伴隨著runlens.

現(xiàn)在,利用cumsum,我們需要在這里做兩件事:初始化zeros并將“適當(dāng)”值放置在零數(shù)組的“key”位置,以便在“cumsum“如果應(yīng)用,我們將得到一個(gè)最后的重復(fù)數(shù)組。valsrunlens時(shí)代。

步驟:讓我們對(duì)上面提到的步驟進(jìn)行編號(hào),為未來(lái)的方法提供一個(gè)更簡(jiǎn)單的視角:

1)初始化零數(shù)組:長(zhǎng)度必須是多少?因?yàn)槲覀冊(cè)谥貜?fù)runlens時(shí)間,零數(shù)組的長(zhǎng)度必須是所有值的總和。runlens.

2)查找關(guān)鍵位置/索引:現(xiàn)在這些關(guān)鍵位置是零位數(shù)組中每個(gè)元素從vals開(kāi)始重復(fù)。因此,為了runlens  = [2,2,1,3],映射到零數(shù)組的關(guān)鍵位置是:

[X 0 X 0 X X 0 0] % where X's are those key positions.

3)找出合適的值:最后的釘子在使用前要錘打。cumsum就是把“適當(dāng)?shù)摹眱r(jià)值觀放在這些關(guān)鍵的位置上。既然我們要cumsum不久之后,如果你仔細(xì)想想,你就需要一個(gè)differentiated版本values帶著diff,所以cumsum關(guān)于那些把我們的values..由于這些區(qū)分值將放置在由runlens使用后的距離cumsum我們會(huì)讓每個(gè)人vals元素重復(fù)runlens時(shí)間作為最終輸出。

解碼

以下是上述所有步驟的實(shí)現(xiàn)-

% Calculate cumsumed values of runLengths. % We would need this to initialize zeros array and find key positions later on.clens = c
umsum(runlens)% Initalize zeros arrayarray = zeros(1,(clens(end)))% Find key positions/indiceskey_pos = [1 clens(1:end-1)+1]% Find appro
priate valuesapp_vals = diff([0 vals])% Map app_values at key_pos on arrayarray(pos) = app_vals% cumsum array for final outputoutput = cum
sum(array)

預(yù)分配哈克

可以看出,上面列出的代碼使用了帶零的預(yù)分配。現(xiàn)在,根據(jù)這個(gè)無(wú)文件的matlab博客關(guān)于更快的預(yù)分配,一個(gè)人可以實(shí)現(xiàn)更快的預(yù)分配-

array(clens(end)) = 0; % instead of array = zeros(1,(clens(end)))

結(jié)束語(yǔ):功能代碼

為了結(jié)束一切,我們將有一個(gè)緊湊的函數(shù)代碼來(lái)實(shí)現(xiàn)這樣的游程解碼。

function out = rle_cumsum_diff(vals,runlens)clens = cumsum(runlens);idx(clens(end))=0;idx([1 clens(1:end-1)+1]) = diff([0 vals]);out = cu
msum(idx);return;

標(biāo)桿

基準(zhǔn)代碼

下面列出的是基準(zhǔn)測(cè)試代碼,用于比較所述運(yùn)行時(shí)和加速比。cumsum+diff在本文中通過(guò)其他cumsum-only基方法在……上面MATLAB 2014B-

datasizes = [reshape(linspace(10,70,4).'*10.^(0:4),1,[]) 10^6 2*10^6]; %fcns = {'rld_cumsum','rld_cumsum_diff'}; % approaches to be benchm
arkedfor k1 = 1:numel(datasizes)
    n = datasizes(k1); % Create random inputs
    vals = randi(200,1,n);
    runs = [5000 randi(200,1,n-1)]; % 5000 acts as an aberration
    for k2 = 1:numel(fcns) % Time approaches  
        tsec(k2,k1) = timeit(@() feval(fcns{k2}, vals,runs), 1);
    endendfigure,      % Plot runtimesloglog(datasizes,tsec(1,:),'-bo'), hold onloglog(datasizes,tsec(2,:),'-k+')set(gca,'xgrid','on'),
    set(gca,'ygrid','on'),xlabel('Datasize ->'), ylabel('Runtimes (s)')legend(upper(strrep(fcns,'_',' '))),title('Runtime Plot')figure,  
        % Plot speedupssemilogx(datasizes,tsec(1,:)./tsec(2,:),'-rx')        
        set(gca,'ygrid','on'), xlabel('Datasize ->')legend('Speedup(x) with cumsum+diff over cumsum-only'),title('Speedup Plot')

關(guān)聯(lián)函數(shù)代碼rld_cumsum.m:

function out = rld_cumsum(vals,runlens)index = zeros(1,sum(runlens));index([1 cumsum(runlens(1:end-1))+1]) = 1;out = vals(cumsum(index));
return;

運(yùn)行時(shí)和加速圖



結(jié)論

建議的方法似乎使我們?cè)?/trans>cumsum-only方法,這是關(guān)于3x!

為什么這是新的cumsum+diff基于基礎(chǔ)的方法比以前更好cumsum-only接近?

嗯,原因的本質(zhì)在于cumsum-only需要將“累計(jì)”值映射到vals..在新的cumsum+diff基于方法,我們正在做diff(vals)相反,matlab只對(duì)其進(jìn)行處理。n元素(其中n是運(yùn)行長(zhǎng)度的數(shù)目)與sum(runLengths)的元素?cái)?shù)。cumsum-only接近時(shí),這個(gè)數(shù)字必須是這個(gè)數(shù)字的許多倍。n因此,這一新方法的顯著加速!


查看完整回答
反對(duì) 回復(fù) 2019-07-02
?
侃侃無(wú)極

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊

我不知道內(nèi)置函數(shù),但有一個(gè)解決方案:

index = zeros(1,sum(b));index([1 cumsum(b(1:end-1))+1]) = 1;c = a(cumsum(index));

說(shuō)明:

首先創(chuàng)建與輸出數(shù)組長(zhǎng)度相同的零向量(即b)。然后,將它們放在第一個(gè)元素中,每個(gè)后續(xù)元素表示一個(gè)新的值序列的開(kāi)始在輸出中的位置。向量的累積和index然后可以用來(lái)索引到a,復(fù)制每個(gè)值所需的次數(shù)。

為了清晰起見(jiàn),這就是各種向量對(duì)于ab在問(wèn)題中:

        index = [1 0 1 0 1 1 0 0]cumsum(index) = [1 1 2 2 3 4 4 4]
            c = [1 1 3 3 2 5 5 5]

編輯:為了完整起見(jiàn)另一種選擇阿瑞芬,但是這似乎需要花費(fèi)20到100倍的時(shí)間才能運(yùn)行到上面的向量長(zhǎng)達(dá)10,000個(gè)元素的解決方案:

c = arrayfun(@(x,y) x.*ones(1,y),a,b,'UniformOutput',false);c = [c{:}];


查看完整回答
反對(duì) 回復(fù) 2019-07-02
  • 3 回答
  • 0 關(guān)注
  • 1063 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)