2014-09-22 57 views
1

在Matlab中,應用使用他們訪問的元素索引的操作的首選方法是什麼?一些簡單的場景:基於元素索引的Matlab應用操作

A(i, j) = A(i, j) + 2*i + 3*j

A(i,j) = A(i,j) + A(i+1,j+1)

除了使用循環,有沒有執行這樣的操作時,利用矩陣元素的索引的任何直接的方式?類似問題的答案,如「Initialize MATLAB matrix based on indices」廣泛使用repmat()。雖然解決方案涉及repmat()的工作,但如果問題有些複雜,那麼對於不擅長Matlab(例如我自己)的人來說,開發並不容易。

回答

1

使用for循環通常沒有什麼問題,所以請記住。

對於你的第一種情況,我不能想到沒有使用repmat,arrayfun或類似的任何解決方案。可以工作的東西是類似於以下內容:

[m,n]=size(A) 
A=A+2*ones(m,1)*(1:n)+3*(1:m).'*ones(1,n) 

使用矩陣乘法,但我同意這不是很明顯!

在第二個例子中,Matlab的索引可以提供幫助。目前尚不清楚你想要發生沿A的最後行/列的元素是什麼,但你可以做這樣的事情:

A(1:end-1,1:end-1)=A(1:end-1,1:end-1)+A(2:end,2:end) 

雖然你可能想使一個新的矩陣,或者如果您保存舊需要做更多的事情。

你的問題是相當廣泛的,有很多技術,希望這兩個給你一些想法,並且不會自動拒絕使用for循環。還有很多方便的Matlab函數可以幫助你解決這類問題,你會在這裏看到彈出的答案。

1

對於第一種情況,您可以使用bsxfun,這是一種在兩個陣列上執行Singleton Expansion的二進制操作的函數。它需要兩個數組並沿尺寸size==1複製,以便數組具有相同的大小,然後對它們執行二進制操作。對於你的第一個例子,你可以做到以下幾點:

i = 1:10; % range for the first dimension 
j = (1:5)'; % range for the second dimension, note the transpose 

A(i, j) = A(i, j) + bsxfun(@plus,2*i,3*j); 

對於第二種情況,這是在做你有什麼有

% define i and j - make sure that you won't get an out of bounds error 
i = 1:10; % range for the first dimension 
j = 2:8; % range for the second dimension 

A(i,j) = A(i,j) + A(i+1,j+1) 
一個簡單的事情