2010-10-17 69 views
2

這是一個關於在同一語句中多次遞增MATLAB數組的一個值而不必使用for循環的問題。在一行中多次遞增MATLAB數組的一個值

設置我的數組:

>> A = [10 20 30]; 

然後運行:

>> A([1, 1]) = A([1, 1]) + [20 3] 

A = 

    13 20 30 

顯然,20被忽略。但是,我想它列入,使:

>> A = [10 20 30]; 
>> A([1, 1]) = A([1, 1]) + [20, 3] 

會給:

A = 

    33 20 30 

是否有一個功能允許這種在一個不錯的,矢量化的方式進行?

(在現實中,所述分度到該陣列將包括多個索引,所以它可能是[1 1 2 2 1 1 1 1 3 3 3]等,用數字的陣列,以通過(所述[20, 3]上述相同的長度的增加)。)

回答

11

你想做的事可以用函數ACCUMARRAY來完成,像這樣什麼:

A = [10 20 30];   %# Starting array 
index = [1 2 2 1];   %# Indices for increments 
increment = [20 10 10 3]; %# Value of increments 
A = accumarray([1:numel(A) index].',[A increment]); %'# Accumulate starting 
                 %# values and increments 

而本實施例的輸出應爲:

A = [33 40 30]; 


編輯:如果A是一個大陣的值,並有短短的增量增加,下面可能比上述計算效率更高:

B = accumarray(index.',increment); %'# Accumulate the increments 
nzIndex = (B ~= 0);    %# Find the indices of the non-zero increments 
A(nzIndex) = A(nzIndex)+B(nzIndex); %# Add the non-zero increments 
+0

aaargh,快30秒:) – Adrien 2010-10-17 20:41:36

+1

謝謝,我有第一個工作的一種享受。我相信在SUBS上沒有轉置符號 - 我只能做'A = accumarray([1:numel(A)索引]',[增量]);'工作。一旦我的數據被填充,我會爲第二個建議做一些速度比較。 – 2010-10-18 09:14:55

+0

@ Bill:你說得對。在這種情況下,我忘了第一個輸入必須是列向量。通常,第一個輸入必須是一個M乘N矩陣,其中M是要累加的值的數量,N是下標的數量(在這種情況下爲1,但對於多維索引而言更多)。 – gnovice 2010-10-18 14:03:19

1

也許有一些我不太明白的地方,但你基本上試圖在A的第一個元素上添加23,對吧?所以,你可以寫:

A([1, 1]) = A([1, 1]) + sum([20 3]) 

此外,如果你有一個索引數組,你可以寫

indexArray = [1 2 2 3 1 1 2 1]; 
toAdd = [20 3]; 
A = [10 20 30]; 

A(indexArray) + sum(toAdd) 

ans = 
33 43 43 53 33 33 43 33 
+0

這並不解決他一般問題。 – 2010-10-17 20:26:48

+0

@Oli Charlesworth:不確定它現在是否有效,但是在編寫評論時我已經編輯了這個問題。 – Jonas 2010-10-17 20:44:23

+1

我認爲一般情況下'toAdd'的長度與'indexArray'的長度相同。所以如果'indexArray'的內容是唯一的,那麼你只需要'A(indexArray)+ toAdd'。 – 2010-10-17 20:46:58