2010-09-13 240 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