2010-09-13 99 views

回答

0

一些僞代碼。每一行都有很多循環遍歷每列。

sum = 0 
for(i = 0; i < matrix.num_rows; i++) { 
    for(j = 0; j < matrix.num_cols; j++) { 
    if(matrix[i][j] % 2 == 0) 
     sum += matrix[i][j] 
    } 
} 

不確定你的意思是座標形式。

+0

OP標記MATLAB作爲語言。應該避免循環,因爲向量化通常要快得多。 Gnovice的解決方案甚至可以削減到一行:'sum(M(mod(M,2)== 0))' – Doresoom 2010-09-13 21:29:04

+0

哦哇,謝謝。我想我沒有意識到OP最初將它標記爲MATLAB。我的錯。 – 2010-09-13 22:14:41

1

這是矩陣M只有它甚至價值觀:

(mod(M,2) == 0).*M

您可以sum(M)sum(sum(M))(不知道什麼是「統籌形式」的意思)概括。

+0

MATLAB沒有'%'運算符。你想要[MOD](http://www.mathworks.com/help/techdoc/ref/mod.html)。 '%'是用來發表評論的。 – gnovice 2010-09-13 15:24:46

+0

@gnovice - 謝謝,這就是你打字得太快:) – adamk 2010-09-13 15:26:08

+0

沒問題。與許多其他使用'%'作爲操作符的語言合作後,這是一個容易忘記的問題。 – gnovice 2010-09-13 15:28:01

4

如果你有矩陣M,可以找到一個logical index(即掩模)對於其中偶數元素是通過使用MOD功能,可以在不需要循環對整個矩陣進行操作。對於在矩陣甚至項除以2後的餘數爲0:

index = (mod(M,2) == 0); 

您可以使用函數FIND得到這些連項的行和列索引:

[rowIndices,colIndices] = find(index); 

而且您可以通過索引M從上面的邏輯掩碼來提取甚至條目和使用SUM功能得到比較穩定的元素的總和,將它們添加了:

evenSum = sum(M(index)); 

下面是使用功能MAGIC創造了一個矩陣M一個例子:

>> M = magic(3) 

M = 

    8  1  6 
    3  5  7 
    4  9  2 

>> index = (mod(M,2) == 0) 

index = 

    1  0  1  %# A matrix the same size as M with 
    0  0  0  %# 1 (i.e. "true") where entries of M are even 
    1  0  1  %# and 0 (i.e. "false") elsewhere 

>> evenSum = sum(M(index)) 

evenSum = 

    20