查找任何行的总和是否等于具有SUM,ANY,SIZE的任何列的总和

时间:2014-12-23 23:34:40

标签: matlab

导师给了我一个任务,检查2D矩阵是否有任何行的总和等于任何列的总和。仅允许使用**1 loop**且仅sumanysize

a = [2 3 4; 5 5 2; 1 3 3; 1 1 1]; --- % Just an example %

rows = size(a,1);
cols = size(a,2);
x = [rows, cols];
tA = a'; i = 1;
RowSum = zeros(rows,1)';
ColSum = zeros(1,cols);

while (i<=max(x))

    if (size(a,1)>=i)
        RowSum(i) = sum(a(i,:));
    end
    if (size(tA,1)>=i)
        ColSum(i) = sum(tA(i,:));
    end
  i=i+1;

end

我知道它可能有点乱,但它给了我这份工作。现在,我不知道如何检查RowSumColSum中是否存在任何匹配值。 (不能使用intersect);有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这就是我所做的:

ColSum = sum(a,1);
RowSum = sum(a,2)';
r = 0;
for i=1:length(ColSum)
    if (any(RowSum==ColSum(i)))
        r = 1;
    end
end
disp(r);

现在试着想一想如果没有循环......

答案 1 :(得分:3)

讨论解决方案和代码

您可以采用此三步流程,并使用 sum size 和<实施解决方案strong> any without using any loop !!

此类实施所遵循的步骤可分为三个步骤 -

  • 获取行和列的输入矩阵之和。

  • 计算沿行的总和的所有元素与沿列的总和之间的距离矩阵。 这基本上是这些步骤中最重要的步骤,否则您至少需要一个循环或bsxfun(用于内部复制)才能执行此操作。 现在,这里的距离矩阵计算是用矩阵乘法进行的,是this solution to Speed-efficient classification in Matlab的简化情况。

  • 对于所有距离矩阵元素,查看是否有任何元素为零。

实现上述步骤的代码看起来像这样 -

%// Get the sum of rows and columns into column vectors - A and B respectively
A = sum(M,2)
B = sum(M,1)' %//'

%// Calculate the distance matrix between A and B
nA = size(A,1);
nB = size(B,1);

A_ext(nA,3) = 0;
A_ext(:,1) = 1;
A_ext(:,2) = -2*A;
A_ext(:,3) = A.^2;

B_ext(nB,3) = 0;
B_ext(:,3) = 1;
B_ext(:,1) = B.^2;
B_ext(:,2) = B;

distmat = A_ext * B_ext.'; %//'

%// For all distance matrix values check if any is zero for the final output
out = any(distmat(:)==0)

样本运行和验证

>> M (Sample input matrix)
M =
     2    14     3
     5     6     7
     1     5     5
     3     1     2

可以看出,第三行的总和是11,它与第一列的总和相同。因此,在距离矩阵中,至少一个元素必须是zero

>> A (Sum along rows)
A =
    19
    18
    11
     6
>> B (Sum along columns)
B =
    11
    26
    17
>> distmat (distance matrix between A and B)
distmat =
    64    49     4
    49    64     1
     0   225    36
    25   400   121

如前所述,(3,1)处有一个零,因此any(distmat(:)==0)的最终输出为1,这是预期的最终结果。

答案 2 :(得分:2)

通过一个循环sumanysize解决后,我建议您阅读bsxfun并找到无循环的单行使用bsxfunsumany的解决方案(将鼠标悬停检查):

  

any(any(bsxfun(@eq, sum(a,1), sum(a,2))))