如何从矩阵中删除具有相同数字的组合行并仅保留其中一个组合?
how I delete combination rows that have the same numbers from matrix and only keeping one of the combinations?
for a=1:50; %numbers 1 through 50
for b=1:50;
c=sqrt(a^2+b^2);
if c<=50&c(rem(c,1)==0);%if display only if c<=50 and c=c/1 has remainder of 0
pyth=[a,b,c];%pythagorean matrix
disp(pyth)
else c(rem(c,1)~=0);%if remainder doesn't equal to 0, omit output
end
end
end
answer=
3 4 5
4 3 5
5 12 13
6 8 10
7 24 25
8 6 10
8 15 17
9 12 15
9 40 41
10 24 26
12 5 13
12 9 15
12 16 20
12 35 37
14 48 50
15 8 17
15 20 25
15 36 39
16 12 20
16 30 34
18 24 30
20 15 25
20 21 29
21 20 29
21 28 35
24 7 25
24 10 26
24 18 30
24 32 40
27 36 45
28 21 35
30 16 34
30 40 50
32 24 40
35 12 37
36 15 39
36 27 45
40 9 41
40 30 50
48 14 50
这道题涉及到勾股定理,但是我们不能使用内置函数,所以我不得不自己写一个。问题是例如前两行的第 1 列和第 2 列具有相同的数字。如果第 1 列和第 2 列具有相同的数字组合,我如何对其进行编码以便仅删除其中一行?我试过独特的功能,但它并没有真正删除组合。我读过有关从以前的帖子中删除重复项的信息,但那些让我更加困惑。任何关于如何解决这个问题的帮助都会对我有很大帮助!
谢谢
欢迎使用 Whosebug。
您的代码中的问题似乎是,pyth
仅包含 3 个值,[a, b, c]
。在这种情况下,下一行中使用的 unique()
函数无效,因为 pyth
中只包含一行。另一个问题是,值 idx
和 out
是在每个循环周期中计算的。这应该放在循环之后。示例代码可能如下所示:
pyth = zeros(0,3);
for a=1:50
for b=1:50
c = sqrt(a^2 + b^2);
if c<=50 && rem(c,1)==0
abc_sorted = sort([a,b,c]);
pyth = [pyth; abc_sorted];
end
end
end
% do final sorting outside of the loop
[~,idx] = unique(pyth, 'rows', 'stable');
out = pyth(idx,:);
disp(out)
编写 MATLAB 代码的其他一些技巧:
- 您不需要以分号结束
for
或 if
/else
语句
else
statements涵盖之前未包含的任何其他情况,因此它们不需要条件。
一些性能推荐:
- 由于
a
和 b
(a^2 + b^2 = b^2 + a^2) 的对称性,b 循环可以限制为 for b=1:a
,这将大致为您节省一半的循环周期。
- 如果您使用
&&
连接标量值,如果第一部分已经失败 (source),则不会计算第二部分。
此致,
克里斯
您也可以线性化您的算法(但我们仍在使用暴力破解):
[X,Y] = meshgrid(1:50,1:50); %generate all the combination
C = (X(:).^2+Y(:).^2).^0.5; %sums of two square for every combination
ind = find(rem(C,1)==0 & C<=50); %get the index
res = unique([sort([X(ind),Y(ind)],2),C(ind)],'rows'); %check for uniqueness
现在您真的可以使用数学优化您的算法了,您应该阅读这篇文章 question。如果 n>>50.
会有用
for a=1:50; %numbers 1 through 50
for b=1:50;
c=sqrt(a^2+b^2);
if c<=50&c(rem(c,1)==0);%if display only if c<=50 and c=c/1 has remainder of 0
pyth=[a,b,c];%pythagorean matrix
disp(pyth)
else c(rem(c,1)~=0);%if remainder doesn't equal to 0, omit output
end
end
end
answer=
3 4 5
4 3 5
5 12 13
6 8 10
7 24 25
8 6 10
8 15 17
9 12 15
9 40 41
10 24 26
12 5 13
12 9 15
12 16 20
12 35 37
14 48 50
15 8 17
15 20 25
15 36 39
16 12 20
16 30 34
18 24 30
20 15 25
20 21 29
21 20 29
21 28 35
24 7 25
24 10 26
24 18 30
24 32 40
27 36 45
28 21 35
30 16 34
30 40 50
32 24 40
35 12 37
36 15 39
36 27 45
40 9 41
40 30 50
48 14 50
这道题涉及到勾股定理,但是我们不能使用内置函数,所以我不得不自己写一个。问题是例如前两行的第 1 列和第 2 列具有相同的数字。如果第 1 列和第 2 列具有相同的数字组合,我如何对其进行编码以便仅删除其中一行?我试过独特的功能,但它并没有真正删除组合。我读过有关从以前的帖子中删除重复项的信息,但那些让我更加困惑。任何关于如何解决这个问题的帮助都会对我有很大帮助!
谢谢
欢迎使用 Whosebug。
您的代码中的问题似乎是,pyth
仅包含 3 个值,[a, b, c]
。在这种情况下,下一行中使用的 unique()
函数无效,因为 pyth
中只包含一行。另一个问题是,值 idx
和 out
是在每个循环周期中计算的。这应该放在循环之后。示例代码可能如下所示:
pyth = zeros(0,3);
for a=1:50
for b=1:50
c = sqrt(a^2 + b^2);
if c<=50 && rem(c,1)==0
abc_sorted = sort([a,b,c]);
pyth = [pyth; abc_sorted];
end
end
end
% do final sorting outside of the loop
[~,idx] = unique(pyth, 'rows', 'stable');
out = pyth(idx,:);
disp(out)
编写 MATLAB 代码的其他一些技巧:
- 您不需要以分号结束
for
或if
/else
语句 else
statements涵盖之前未包含的任何其他情况,因此它们不需要条件。
一些性能推荐:
- 由于
a
和b
(a^2 + b^2 = b^2 + a^2) 的对称性,b 循环可以限制为for b=1:a
,这将大致为您节省一半的循环周期。 - 如果您使用
&&
连接标量值,如果第一部分已经失败 (source),则不会计算第二部分。
此致,
克里斯
您也可以线性化您的算法(但我们仍在使用暴力破解):
[X,Y] = meshgrid(1:50,1:50); %generate all the combination
C = (X(:).^2+Y(:).^2).^0.5; %sums of two square for every combination
ind = find(rem(C,1)==0 & C<=50); %get the index
res = unique([sort([X(ind),Y(ind)],2),C(ind)],'rows'); %check for uniqueness
现在您真的可以使用数学优化您的算法了,您应该阅读这篇文章 question。如果 n>>50.
会有用