导师给了我一个任务,检查2D矩阵是否有任何行的总和等于任何列的总和。仅允许使用**1 loop**
且仅sum
,any
,size
。
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
我知道它可能有点乱,但它给了我这份工作。现在,我不知道如何检查RowSum
和ColSum
中是否存在任何匹配值。 (不能使用intersect
);有什么想法吗?
答案 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)
通过一个循环sum
,any
,size
解决后,我建议您阅读bsxfun
并找到无循环的单行使用bsxfun
,sum
,any
的解决方案(将鼠标悬停检查):
any(any(bsxfun(@eq, sum(a,1), sum(a,2))))